Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中的实例变量的作用类似于类变量_Ruby_Variables_Instance Variables_Class Variables - Fatal编程技术网

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,我如何联系你?:)