在类和方法中定义类实例变量之间的区别是什么。为什么?

时间:2012-06-21 03:06:51

标签: ruby variables instance-variables class-instance-variables

嗯,就像显示的标题一样,

下面的两个类实例变量之间有什么区别
class Document
  @default_font = :Arial
  ...
end

class Document
  def foo
    @default_font = :Arial
  end
  ...
end

有没有人可以向我解释。非常感谢你。

3 个答案:

答案 0 :(得分:1)

第二种情况不是类实例变量。这是一个普通的旧实例变量。

答案 1 :(得分:0)

在你的第一种情况下,变量既不是类变量(它应该以{{1​​}}开头,也不是实例变量。它只是一个在当前范围之外不可用的局部变量,甚至在实例中也是如此方法

第二个是实例变量。

@@

实例方法中的class Document attr_accessor :var1, :var2 @var1 = 1 puts @var1 + 2 def initialize @var2 = 4 puts @var2**2 #puts @var1 + 6 end end 1.9.2p0 :208 > class Document 1.9.2p0 :209?> attr_accessor :var1, :var2 1.9.2p0 :210?> @var1 = 1 1.9.2p0 :211?> puts @var1 + 2 1.9.2p0 :212?> 1.9.2p0 :213 > def initialize 1.9.2p0 :214?> @var2 = 4 1.9.2p0 :215?> puts @var2**2 1.9.2p0 :216?> #puts @var1 + 6 1.9.2p0 :217 > end 1.9.2p0 :218?> 1.9.2p0 :219 > end 3 => nil 1.9.2p0 :220 > d = Document.new 16 => #<Document:0x1a2f0c @var2=4> 会出错。

答案 2 :(得分:0)

我没有看到原帖的最终答案。我最近读过Russ Olsen的书“Eloquent Ruby”,于是决定在这里添加我的外卖。

第一个示例定义single-variable的范围是类范围,即,如果关键字 self 出现在方法def之外但仍在类定义中,则将引用对象Document,而对象Document又是Class类的一个实例。

第一个例子因此定义了一个类实例变量,即变量@default_font是对象Document的一个实例变量,一个类对象。

此类实例变量只能通过类级别访问器方法访问,,例如Document.default_font,而不是说,an_instance_of_Document.default_font

所以如果你定义了attr_accessors:

class Document
  @default_font = :Arial # this is a class instance variable, 

#  def self.default_font
#    @default_font
#  end
#
#  def self.default_font=(font)
#    @default_font = font
#  end

  # or replace the above two class methods with the following

  class << self
    attr_accessor :default_font
  end
end

这是一些irb输出:

1.9.3p429 :002 > require './document.rb'
 => true 
1.9.3p429 :004 > Document.default_font
 => :Arial 
1.9.3p429 :005 > Document.default_font = :Times
 => :Times 
1.9.3p429 :006 > Document.default_font 
 => :Times 
1.9.3p429 :007 > doc = Document.new
 => #<Document:0x007fe6730d8228> 
1.9.3p429 :008 > doc.default_font
NoMethodError: undefined method `default_font' for #<Document:0x007fe6730d8228>

原始帖子中的第二个示例在方法def之外不包含单个@变量定义这一事实表明@default_font这里是一个实例变量,只能由类Document的实例化对象引用。

class Document
  def default_font=(font)
    @default_font = font # this defines and set an instance variable
  end

  def default_font
    @default_font        # this defines an instance variable
  end

  # or above two defs can be replaced by the following
  attr_accessor :default_font  # this defines the instance variable and access methods
end

这是一些irb输出:

1.9.3p429 :001 > require './document.rb'
 => true 
1.9.3p429 :002 > Document.default_font
NoMethodError: undefined method `default_font' for Document:Class
1.9.3p429 :003 > doc = Document.new
 => #<Document:0x007ffbf1136f88> 
1.9.3p429 :004 > doc.default_font
 => nil 
1.9.3p429 :005 > doc.default_font = :Arial
 => :Arial 
1.9.3p429 :006 > doc.default_font
 => :Arial