【问题标题】:Difference between Ruby's class variable and instance variableRuby的类变量和实例变量的区别
【发布时间】:2013-06-24 13:09:50
【问题描述】:

我认为类变量实例变量之间没有明显区别。 类变量也可以看作是一个实例变量。我对吗?

例如:

class Test
  @class_var = 'hello world'

  def self.show_class_var
    @class_var
  end

  def show_class_var
    puts self.class.show_class_var
  end
end

所以,我认为我们可以将类变量视为当前类的实例变量(Test)。如果我们定义@@class_var = 'hello world',唯一的好处就是我们可以在实例方法中直接引用@@class_var。我只是想知道我是否正确。我是吗?

【问题讨论】:

  • 你所说的“类变量”不是类变量。它是类对象上的实例变量。真正的类变量前面加上@@
  • 谢谢大家回答我的问题:)类变量可以在子类中看到,而实例变量不能。我认为这是主要区别。 (我没想到会因为我的问题而吵架...我不知道会发生什么。但我仍然感谢您的耐心等待)

标签: ruby


【解决方案1】:

我认为“instance variable, class variable and the difference between them in ruby”很好地解释了局部变量、实例变量和类变量之间的区别。

【讨论】:

  • 不要说“这篇文章”,这和“点击这里”一样糟糕,对锚文本使用更具描述性的东西。它可以帮助那些正在阅读您的答案的人决定是否要关注它,并且当答案被搜索引擎索引时它会有所帮助。见 W3 推荐“Don't use 'click here' as link text
【解决方案2】:

+1 OMG 的回答,有一个转折:不要忘记类本身就是对象,这意味着还有第三个不完全是类,但也不是完全但实际上是变量的实例类型,对于类本身。

例子:

class A
  # instance variable of objects of class A (and its subclasses)
  # not shared between instances
  def foo; @foo; end
  def foo=(foo); @foo = foo; end

  class << self
    # instance variable of class A
    # not available to subclasses of A
    def bar; @bar; end
    def bar=(bar); @bar = bar; end
  end

  # class variable of A
  # shared by subclasses of A
  def baz; @@baz; end
  def baz=(baz); @@baz = baz; end
end

class B < A; end

使用上面的,你得到:

a = A.new
b = B.new

a.foo = :foo
a.class.bar = :bar
a.baz = :baz

p a.foo         # :foo
p a.class.bar   # :bar
p a.baz         # :baz

p b.foo         # nil
p b.class.bar   # nil
p b.baz         # :baz

【讨论】:

  • 谢谢你提到同样的事情,我在一半的路上,但现在从我的编辑器中删除了这些行。感谢您的帮助:))
  • 我没有投反对票...但是现在下着大雨..我对此感到非常沮丧..我做了 +1你..我认为没有理由投反对票:(
  • 我听到了。对我来说最恼人的是昨天:我有一个接受的答案变成了评论,用于突出显示框外的解决方案,而不是说如何修复空洞的代码。哦,好吧...
【解决方案3】:

我认为类变量和实例变量之间没有明显区别。

没有细微差别。正如韦恩康拉德在his answer here 中所说:

类变量 (@@) 在类及其所有后代之间共享。

类实例变量 (@) 不被类的后代共享。

@@:类变量(我会推荐使用class instance variable,而不是class variable,这样可以减少混淆,新手一般都会这样做。)

class Foo;end
#setting class variable @@var
Foo.class_variable_set(:@@var, "good morning!")
#getting class variable @@var via Foo
Foo.class_variable_get(:@@var) # => "good morning!"
class Bar < Foo ;end
#getting class variable @@var via Bar subclass of Foo
Bar.class_variable_get(:@@var) # => "good morning!"

@ : 实例变量

class Foo;end
foo = Foo.new
#setting instance variable @var
foo.instance_variable_set(:@var, "good morning!")
#getting instance variable @var via foo object
foo.instance_variable_get(:@var) # => "good morning!"
class Bar < Foo ;end
bar = Bar.new
#getting instance variable @var via bar object,whose class is a subclass of Foo
bar.instance_variable_get(:@var) # => nil 

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2014-09-21
    • 2014-06-18
    • 2013-03-24
    • 2017-02-15
    相关资源
    最近更新 更多