ruby中的实例变量的作用类似于类变量
@-实例变量 @@-类变量 所以,如果没有创建实例,则不应共享实例变量值。但是:ruby中的实例变量的作用类似于类变量,ruby,variables,instance-variables,class-variables,Ruby,Variables,Instance Variables,Class Variables,@-实例变量 @@-类变量 所以,如果没有创建实例,则不应共享实例变量值。但是: class Add def self.add(what) if not defined? @a @a = 0 end @a += what puts @a.to_s end end Add.add(4) Add.add(4) 结果: $ruby main.rb 4 8 为什么?您在中引用的@a是Add类的实例变量 当您将方法定义为def self.add
class Add
def self.add(what)
if not defined? @a
@a = 0
end
@a += what
puts @a.to_s
end
end
Add.add(4)
Add.add(4)
结果:
$ruby main.rb
4
8
为什么?您在中引用的
@a
是Add类的实例变量
当您将方法定义为
def self.add
而不是def add
时,您已经有效地将方法声明的范围更改为eigenclass,您在中引用的@a
是add类的实例变量
当您将方法定义为
def self.add
而不是def add
时,您已经有效地将方法声明的范围更改为eigenclass。Ruby中的每个类也是一个对象,类的实例。因此,您的@a
只是Add
类的实例变量 Ruby中的每个类都是对象,是class
class的实例。因此,您的@a
只是Add
类的实例变量 为什么是“特征类”?它是对象本身的一个实例变量(即Add
class),而不是它的本征类:(class nil
@MarekLipka,请阅读第二个链接中关于类方法的部分,您可能会重新考虑downvote。tl;dr:所有类方法都包含在特定类实例的本征类中。这与“类方法”(当然,这是正确的,它们位于特定类
实例的特征类中)。这是关于实例变量的。请考虑我的例子。@MarekLipka-我明白了,你是对的。请留下否决票,这是理所当然的。感谢你的这一小启示:)我将删除特征类。为什么是“特征类”?它是对象本身的实例变量(即Add
class),而不是它的特征类:(class nil
@MarekLipka请阅读第二个链接中关于类方法的部分,您可能会重新考虑downvote。tl;dr:所有类方法都包含在特定类实例的本征类中。这不是关于“类方法”(当然,这是正确的,它们被放置在特定的类
实例的特征类中)。这是关于实例变量的。请考虑我的例子。@MarekLipka-我明白了,你是对的。留下否决票,这是应得的。感谢你给我的这一小启示:)我将删除本征类。旁白:@a | |=0
是的常用替代品,如果没有定义?@a..
。前者是@a=@a | | 0
,就像x+=1
是x=x+1
。旁白:@a |=0
是的常用替代品,如果没有定义?
前者是@a=@a | | 0
的简写,就像x+=1
是x=x+1
一样。那么为什么要添加。添加(4)第二次运行结果为8。@a不是global@user665967这是因为@a
是Add
类的实例变量。当您修改某个对象的实例变量值时,该对象保持不变,其实例变量也保持不变。如果我错了,请纠正我,因此类方法中的@variables基本上是实例变量b但会自动成为对象上的类变量level@user665967不。关键是在Ruby中,每个类都是一个具有所有后果的对象。其中一个后果是它有自己的实例变量。所以如果你定义“类方法”“你在它里面使用实例变量,这个实例变量属于这个类实例。而且,重要的是,它不是一个类变量,这是一个有点不同的概念。马瑞克,我如何联系你?:)好的,那么为什么要添加。添加(4)第二次运行结果为8。@a不是global@user665967这是因为@a
是Add
类的实例变量。当您修改某个对象的实例变量值时,该对象保持不变,其实例变量也保持不变。如果我错了,请纠正我,因此类方法中的@variables基本上是实例变量b但会自动成为对象上的类变量level@user665967不。关键是在Ruby中,每个类都是一个具有所有后果的对象。其中一个后果是它有自己的实例变量。所以如果你定义“类方法”你在里面使用实例变量,这个实例变量属于这个类实例。而且,重要的是,它不是一个类变量,这是一个有点不同的概念。Marek,我如何联系你?:)