在Ruby中,在类方法的上下文中,实例和类变量是什么?

在Ruby中,在类方法的上下文中,实例和类变量是什么?,ruby,class-variables,class-instance-variables,Ruby,Class Variables,Class Instance Variables,如果我有以下一段Ruby代码: class Blah def self.bleh @blih = "Hello" @@bloh = "World" end end 究竟什么是@blih和@bloh@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@bloh是Blah的类、类中的一个变量?前缀为两个at符号的变量是一个类变量,可以在类的实例和类方法中访问 例如: class CountEm @@children = 0

如果我有以下一段Ruby代码:

class Blah
  def self.bleh
    @blih = "Hello"
    @@bloh = "World"
  end
end

究竟什么是@blih和@bloh@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@bloh是Blah的类、类中的一个变量?

前缀为两个at符号的变量是一个类变量,可以在类的实例和类方法中访问

例如:

class CountEm
  @@children = 0

  def initialize
    @@children += 1
    @myNumber = @@children
  end

  def whoAmI
    "I'm child number #@myNumber (out of #@@children)"
  end

  def CountEm.totalChildren
    @@children
  end
end

c1 = CountEm.new
c2 = CountEm.new
c3 = CountEm.new
c1.whoAmI              # -> "I'm child number 1 (out of 3)"
c3.whoAmI              # -> "I'm child number 3 (out of 3)"
CountEm.totalChildren  # -> 3
示例摘自【为清晰起见编辑】

在您的示例中,设置@blih在类方法的作用域之外不可见,因为在类方法内部没有实例可以将实例变量绑定到它


说到术语,我会说“@@bloh是类Blah中的一个类变量”,但不是“Blah的类中的变量”。类“Class”保持不变。

有一种方法可以解决这种疯狂

class Example
  @foo # class instance variable
  @@bar # class variable

  def fun1
    @baz # instance variable
  end
end
实例变量 实例变量(
@foo
@baz
在示例中)始终以
@
开头,并且它们始终属于自身引用的任何对象:类的对象或表示类的类对象。类定义或类方法中的实例变量引用与实例方法中的实例变量引用完全不同

继承
因为实例变量不是由类定义的,它们与继承机制无关——它们只是在为它们赋值时创建的。类实例变量只是表示类的类对象的实例变量,因此不会被继承

类变量 类变量对类的类方法和实例方法以及类定义本身可见,并由它们共享。类变量可以在实例方法、类方法中使用,也可以在任何方法之外的类定义本身中使用类变量始终参照由封闭类定义语句创建的类对象进行计算

类实例变量vs实例变量 类实例变量的一个缺点是它们不能像类变量那样在实例方法中使用。另一个缺点是可能会将它们与普通实例变量混淆。与类变量相比,类实例变量的一个优势在于,在对现有类进行子类化时,类变量的行为令人困惑:如果类使用类变量,则任何子类都可以通过更改共享类变量的值来改变类及其所有子类的行为。这是使用类实例变量而不是类变量的有力论据

这其中大部分来自优秀的

人们似乎忽视了该方法是类方法

@blih将是常量Bleh类实例的实例变量。因此:

irb(main):001:0> class Bleh
irb(main):002:1>   def self.bleh
irb(main):003:2>     @blih = "Hello"
irb(main):004:2>     @@blah = "World"
irb(main):005:2>   end
irb(main):006:1> end
=> nil
irb(main):007:0> Bleh.instance_variables
=> []
irb(main):008:0> Bleh.bleh
=> "World"
irb(main):009:0> Bleh.instance_variables
=> ["@blih"]
irb(main):010:0> Bleh.instance_variable_get :@blih
=> "Hello"
@@blah将作为Bleh的类变量提供:

irb(main):017:0> Bleh.class_variables
=> ["@@blah"]
irb(main):018:0> Bleh.send :class_variable_get, :@@blah
=> "World"

OP了解什么是类变量,他在问当在类方法中使用时,它们可能会发生什么变化。我不确定,但如果是这样的话,我道歉。我的错。有一个实例要附加到。类是类的实例,在计算类定义时将实例化该类。>哎呀,有什么例子吗?Class=>truecrudson是正确的,
@blih
是附加到类
Blah
@banister的实例变量:我倾向于不同意。我想我用粗体的两句话明确地回答了这个问题。我本可以把这些陈述放在没有其他内容的地方,但我认为它没有多大用处。不管怎样,那只是我的意见。