首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >@@variable在Ruby中是什么意思?

@@variable在Ruby中是什么意思?
EN

Stack Overflow用户
提问于 2011-05-05 05:33:13
回答 4查看 110.1K关注 0票数 176

什么是前面有两个at符号的Ruby变量(@@)?我对带有at符号的变量的理解是它是一个实例变量,就像在PHP中这样:

PHP版本

代码语言:javascript
复制
class Person {

    public $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

Ruby等效项

代码语言:javascript
复制
class Person

    def set_name(name)
        @name = name
    end

    def get_name()
        @name
    end
end

双at符号@@是什么意思,它与单at符号有什么不同?

EN

回答 4

Stack Overflow用户

发布于 2011-05-05 05:46:39

@ -类的实例变量

@@类变量,在某些情况下也称为静态变量

类变量是在类的所有实例之间共享的变量。这意味着从这个类实例化的所有对象只有一个变量值。如果一个对象实例更改了变量的值,那么所有其他对象实例的新值都将发生本质上的变化。

另一种思考类变量的方式是在单个类的上下文中作为全局变量。通过在变量名前加上两个@字符(@@)来声明类变量。类变量必须在创建时初始化

票数 39
EN

Stack Overflow用户

发布于 2011-05-05 05:34:13

@@表示一个类变量,即它可以被继承。

这意味着如果创建该类的子类,它将继承变量。因此,如果您有一个带有类变量@@number_of_wheelsVehicle类,那么如果您创建了一个class Car < Vehicle,那么它也将具有类变量@@number_of_wheels

票数 11
EN

Stack Overflow用户

发布于 2017-05-16 11:44:46

当类扩展或包含模块时,模块中的@和@@的工作方式也不同。

所以给出了

代码语言:javascript
复制
module A
    @a = 'module'
    @@a = 'module'

    def get1
        @a          
    end     

    def get2
        @@a         
    end     

    def set1(a) 
        @a = a      
    end     

    def set2(a) 
        @@a = a     
    end     

    def self.set1(a)
        @a = a      
    end     

    def self.set2(a)
        @@a = a     
    end     
end 

然后,您将获得以下显示为注释的输出

代码语言:javascript
复制
class X
    extend A

    puts get1.inspect # nil
    puts get2.inspect # "module"

    @a = 'class' 
    @@a = 'class' 

    puts get1.inspect # "class"
    puts get2.inspect # "module"

    set1('set')
    set2('set')

    puts get1.inspect # "set" 
    puts get2.inspect # "set" 

    A.set1('sset')
    A.set2('sset')

    puts get1.inspect # "set" 
    puts get2.inspect # "sset"
end 

class Y
    include A

    def doit
        puts get1.inspect # nil
        puts get2.inspect # "module"

        @a = 'class'
        @@a = 'class'

        puts get1.inspect # "class"
        puts get2.inspect # "class"

        set1('set')
        set2('set')

        puts get1.inspect # "set"
        puts get2.inspect # "set"

        A.set1('sset')
        A.set2('sset')

        puts get1.inspect # "set"
        puts get2.inspect # "sset"
    end
end

Y.new.doit

因此,在模块中对所有变量使用@@,在模块中对变量使用@,在每个使用上下文中分隔变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5890118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档