[置顶] ruby变量详解(收集+整理)
ruby的变量有局部变量,全局变量,实例变量,类变量,常量。
1、局部变量
局部变量以一个小写字母开头或下划线开头
局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声明所在的块、方法定义、类/模块定义的结尾。大家在写代码时经常这样写:
irb(main):001:0> i=123 ---------- 这里的i就是局部变量
=>123
irb(main):002:0> s="hi" ---------- 这里的s就是局部变量
=>"hi"
ruby的变量是动态变量,某个变量在前一刻是数字型,在后一刻可以是字符型:
irb(main):003:0> x=321
=>321
irb(main):004:0> x="hello"
=>"hello"
ruby是动态变量,但却是强类型,例如字符和数字不能直接相加:
irb(main):005:0> x=10
=>10
irb(main):006:0> y="hi"
=>"hi"
irb(main):007:0> x+y
TypeError: String can't be coerced into Fixnum
from(irb):7:in '+'
from(irb):7
from : 0
必须手工进行转换: irb(main):008:0> x.to_s + y
=> "10hi"
2、全局变量
ruby的全局变量以$开头,例如: $x $y。全局变量可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为nil
ruby有内置的全局变量,应该是从perl哪里抄来的,例如 $!记录最近一次产生的错误,$. 表示行号等。良好的编程实际,是不使用全局变量,他们危险而难以跟踪。
3、实例变量
ruby的实例变量以@开头,是指实例化后的对象,才绑定的变量。实例变量属于特定的对象。例如:
irb(main):016:0> class Myclass
irb(main):017:0> def initialize(name,gender,age)
irb(main):018:0> @name=nameirb(main):019:0> @gender=gender
irb(main):020:2> @age=age
irb(main):021:0> end
irb(main):022:0> end
=> nil ---------------@name, @gender,@age都是实例变量。可以在类或子类的方法中引用实例变量。若引用尚未被初始化的实例变量的话,其值为nil。irb(main):023:0> x=Myclass.new("john")
=> #<Myclass:0x7f2e15a7dad8 @name="john">Myclass类,他的构造器接收一个name参数,然后把该参数赋值给实例变量@name。
x是Myclass的实例,她拥有实例变量@name。
只有在类被实例化时,实例变量才产生和存在。但是,实例对象并不能直接访问实例变量:
irb(main):022:0> x.@name
SyntaxError: compile error
(irb):22: syntax error, unexpected tIVAR
from (irb):22
from :0
这样是错误的。必须在;类里面,定义get方法,来访问实例变量:
irb(main):023:0> class Myclass
irb(main):024:1> def name
irb(main):025:2> @name
irb(main):026:2> end
irb(main):027:1> end
=> nilirb(main):028:0> x.name
=> "john"
当然,也可以定义set方法,来设置实例变量:
irb(main):029:0> class Myclass
irb(main):030:1> def name=(value)
irb(main):031:2> @name=value
irb(main):032:2> end
irb(main):033:1> end
=> nilirb(main):034:0> x.name="jean"
=> "jean"irb(main):035:0> x.name
=> "jean"
这个set和get,可以通过ruby的元编程来实现,例如:
irb(main):036:0> class Myclass
irb(main):037:1> attr_accessor :age
irb(main):038:1> end
=> nilirb(main):039:0> x.age=20
=> 20irb(main):040:0> x.age
=> 20
只要设置attr_accessor就够了,他会对@age这个实例变量,创建set和get方法。
irb(main):041:0> x
=> #<Myclass:0x7f2e15a7dad8 @name="jean", @age=20>对应的还有attr_reader只设置get方法,attr_writer只设置set方法。
4、类变量
ruby的类变量以@@开头,例如在类里申明的@@x @@y 等,一般很少使用。
类变量在类的定义中定义,可以在类的特殊方法、实例方法等处对类变量进行赋值和引用。类变量被类,类的子类和他们的实例对象共享。
class Person
@@number = 0 #使用前必须有初值
def initialize(name, gender, age)
@name = name
@gender = gender
@age = age
@@number += 1
end
end
类变量是私有的,在类外无法直接访问,你只能通过实例方法和类方法去访问它。可以把类变量看作一种被类、子类以及它们的实例所共享的全局变量。
模块中定义的类变量(模块变量)被所有包含该模块的类所共享。
module TestModule
@@foo = 10
end
class Klass
include Foo
p @@foo += 1 # => 11
end
class Base
include Foo
p @@foo += 2 # => 12
end
5、常量
ruby的常量以大写字母开头,常数的定义和初始化由赋值过程完成。
irb(main):048:0>Pi=3.14 ----------Pi就是一个常量
=>3.14
然而,ruby的常量是可以改变的。若对已定义的常数进行赋值的话,会出现警告信息:
irb(main):049:0> Pi=3.15
(irb):49: warning: already initialized constant Pi
=> 3.15irb(main):050:0> Pi
=> 3.15
尽管触发警告,但常量的确被改变了。
注意:1)若引用未定义的常数会引发NameError异常。
2)常量可以定义在类和模块中,不能定义在方法中
通常在类里设置常量:
irb(main):051:0> class Myclass
irb(main):052:1> Pi=3.1415
irb(main):053:1> end
=> 3.1415
3)若想在外部访问类或模块中的常数时,要使用“::”操作符.
从类的外部访问这个常量:irb(main):055:0>Myclass::Pi
=>3.1415
模块也一样,例如访问ruby内置的Math模块的PI常量: irb(main):056:0>Math::PI
=>3.14159265358979
4)在类定义表达式生成类对象的同时,还会将类对象赋值给一个与该类同名的常数,引用类名也就是引用该常数。
class Test
end
p Test.class #Class
p Test #test
若想访问Object类中的常数(顶层的常数)时,也需要也使用"::"操作符,但操作符左边为空。
[置顶] ruby变量详解(收集+整理)的更多相关文章
- [置顶] SNMP协议详解<二>
上一篇文章讲解了SNMP的基本架构,本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1.v2c.v3)进行区别! 四.SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Agent ...
- [置顶] SNMP协议详解<三>
在上篇文章中,说到了SNMPv3主要在安全性方面进行了增强,采用USM(基于用户的安全模型)和VACM(基于视图的访问控制模型)技术.下面我们就主要讲解SNMPv3的报文格式以及基于USM的认证和加密 ...
- Nginx基础篇(2)- Nginx基本配置文件和变量详解
Nginx基本配置文件和变量详解 1. 基本配置文件 /etc/nginx/nginx.conf # nginx运行的用户 user nginx; # nginx进程数,建议设置为等于CPU总核心数. ...
- Ansible Facts 变量详解
Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...
- mysql show variables系统变量详解
mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...
- Maya 常用环境变量详解
Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...
- Shell学习之Bash变量详解(二)
Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...
- asp.net core环境变量详解
环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...
随机推荐
- 一条sql语句循环插入N条不同记录(转)
SET NOCOUNT ON IF (OBJECT_ID('TB' ) IS NOT NULL ) DROP TABLE TB GO CREATE TABLE TB(ID INT IDENTITY ( ...
- css样式积累
1.圆角: border-radius:16px 16px 16px 16px; 2透明度: filter: alpha(opacity=80); ...
- js浏览器键盘事件控制(转自新浪微博)
js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...
- 微信小程序,大多数人误解的8个问题
作者:王安,数字天堂DCloud公司创始人兼CEO 注:本文内容包含技术.商业,不懂技术的读者可以只看商业相关的内容.本文仅代表作者一家之言,如有不同意见,欢迎留言讨论~ 8个误解 坊间所传的信息很多 ...
- log4j 1.2配置(转载)
转载自:http://www.blogjava.net/kit-soft/archive/2009/08/28/292977.html 第一步:加入log4j-1.2.8.jar到lib下. 第二步: ...
- ecshop数据库操作类
ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现. 好处:实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小. 当网站需要做me ...
- PHP面向对象(OOP):把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化(也叫序列化), 就像我们现在想把一辆汽车通过轮船运到美国去,因为 ...
- CoreLocation MKMapView
高德开发者平台 有开发指南 iOS9配置网络: <key>NSAppTransportSecurity</key> <dict> <key>NSAllo ...
- winform 对话框控件,打印控件
1.文件对话框(FileDialog) 它又常用到两个: 打开文件对话框(OpenFileDialog) 保存文件对话框(SaveFileDialog) 2.字体对话框(FontDialog) 3.颜 ...
- DevOps - Development And Operations
简介: 研发运维一体化 相关资料: 关于DevOps你必须知道的11件事 我眼中的DevOps DevOps 门户 docker for dotnet系列 docker4dotnet #1 前世今生 ...