论坛首页 编程语言技术论坛

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

浏览 1846 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-07  
变量查找

在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提供的类继承属性,这些继承的值有被控制和容易辨认的方式。
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics