2010-03-01 77 views
0

我看到Ruby有以下变量: - 全局变量(由$变量名代表) - 类变量(由@@变量名代表) - 实例变量(由@variable_name表示)和 - 本地变量(由变量名或_variable_name表示)红宝石变量澄清

偶尔我看到在轨道源代码如下:

类SomeClass的 @var 端

在这里,@var代表什么,你称它为元类变量? 也是什么使用这种变量的优势?

+0

您可以发布一个实际的例子吗? – phtrivier 2010-03-01 16:08:36

+0

它只是一个普遍的问题,当我阅读Ruby文档并且偶然发现所有东西都是Ruby中的一个对象时,这意味着类本身就是对象,并且它们可以拥有自己的实例变量,所以我想到这个。另外我不记得实际的文件,但我记得在rails代码中看到了一些用法。 – Dharam 2010-03-01 16:26:28

回答

1

它是类实例变量之一。在Ruby中,一切都是一个对象,甚至是类,所以类可以有实例变量也就不足为奇了。

class A 
    @@class_var = 1 
    @instance_var = 1 
end 
A.class_variables 
#=> ["@@class_var"] 
A.instance_variables 
#=>["@instance_var"] 

More Info

+0

那就是我的想法,但什么是使用类实例变量的目的或用例?从这个特定的类创建的所有实例是否也共享这些?如果是的话,一个类的实例如何访问这些变量?我们不能只说@instance_var,它会试图查询实例实例变量,我们不能只说@@ instance_var,它会尝试查询类变量。 – Dharam 2010-03-01 16:23:39

+0

@instance仅用于对象的当前实例(所有对象都有此变量,但它的值对于实例是唯一的) @@ class在对象的所有实例之间共享(所有对象都有并共享此变量,值并非唯一) 查看attr_accessor:myvariable作为设置变量的获取和设置的快速方法。 – Beanish 2010-03-01 16:30:16

+0

您不能访问它,因为它是一个私有变量。 如果您像这样定义访问器(def A.get_instance_var @instance_var end),则可以使用(A.new).class.get_instance_var来访问它。至于这个功能...这是元编程的美妙之处,你不知道什么是可能的或有用的,直到你尝试它,它的工作,并且它解决了一些问题;) – phtrivier 2010-03-01 16:37:02