Advanced Rails -- Ruby 基本技术(4) -- Ruby 基础3

[b]变量查找[/b]

在Ruby里有4种变量类型:全局变量,类变量,实例变量和局部变量。全局变量是全局储存的,局部变量储存是lexically,这里他们和我们的讨论不相关,因为他们和Ruby的类系统没有交互。

实例变量是对于一个特定的对象。它用一个@最为前缀来定义:@price是一个实例变量。正因为Ruby的对象有一个v_tbl的结构,任何一个对象就可以有实例变量。

一个类也是一个对象,所以类也有实例变量。下面的代码访问一个类的实例变量


class A
@ivar = "Instance variable of A"
end

A.instance_variable_get(:@ivar) # => "Instance variable of A"


实例变量通常是由self基于指向的对象来决定的。因为self是在class A ... end 定义中A的类对象,@ivar属于类A的对象。

类变量是不一样的。一个类的任何实例都可以访问他的类变量(是以@@开头)。类变量也可以被类自身的定义引用。尽管一个类的类变量和实例变量相似,但是他们是不同的


class A
@var = "Instance variable of A"
@@var = "Class variable of A"

def A.ivar
@var
end

def A.cvar
@@var
end
end

A.ivar # => "Instance variable of A"
A.cvar # => "Class variable of A"


在这个示例代码里,@var和@@var被保存在同一个地方,A的iv_table里。但是,他们是不同的变量,应为他们有不同的名字(@也被保存在存储变量名字里)。Ruby的访问实例变量和类变量的功能会检查以保证名字按着正确的形式传递。


A.instance_variable_get(:@@var)
# ~> -:17:in 'instance_variable_get': '@@var' is not allowed as an instance
variable name (NameError)



类变量使用有些让人迷惑。他们被继承链下方所共享,所以子类去更改类变的时候也就同时更改了父类的类变量


>> class A; @@x = 3 end
=> 3
>> class B < A; @@x = 4 end
=> 4
>> class A; @@x end
=> 4


这个有用,也很迷惑。一般上,你可以需要类实例变量——和继承链无关的——或者ActiveSupport提供的类继承属性,这些继承的值有被控制和容易辨认的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值