冗余在instance_variable_set记号,instance_variable_get
当我使用一些名称设置或获取实例变量,例如@foo
,我可以这样做:冗余在instance_variable_set记号,instance_variable_get
instance_variable_set( “@富”,SOME_VALUE)
.. 。
instance_variable_get(“@富”)
但往往,我使用的方法名,其中不包括@
前缀的变量,所以我最终会做:
方法=:FOO
...
instance_variable_set( “@#{方法}”,SOME_VALUE)
...
instance_variable_get( “@#{方法}”)
但由于所有实例变量的前缀为@
,我认为输入"@#{method}"
而不是简单地输入method
是多余的。为什么instance_variable_set
和instance_variable_get
没有设计没有@
接受串/符号作为第一个参数是这样的方法:
方法=:FOO
...
instance_variable_set(方法,SOME_VALUE)
.. 。
instance_variable_get(方法)
其中变量要被实际设定将@foo
而非foo
?
它的方式有什么优势吗?
原因很简单,实例变量名为@foo
,而不是foo
。 @
是部分的变量名称,正如$
是全局变量名称$foo
的一部分。
之所以@
调用attr_accessor
和朋友的时候是没有必要的,因为它们定义属性的方法,因此是很有意义提供方法名称,而不是变量名。
当然没有技术原因instance_variable_set
不能预先设定@
本身。但是,该方法接受对应于变量名称的符号。符号由定义表示具有给定名称的标识符。所以对应于实例变量@foo
的只有符号是:@foo
。这就是为什么你有包括@
,因为我们知道:foo
根本不对应任何实例变量标识符。 (如果你提供一个字符串,它将首先在内部转换为符号。)
更新:在C Ruby实现(MRI)中,实际上在code that handles instance variables的任何地方都没有提及@
。只有parser知道实例变量以@
开头。所以看起来,将代码与实现分离是另一个可能的原因。
没有使用'instance_variable_(get | set)'代码味道? –
':“你好吗?”'是一个有效的符号 - 它是一个有效的变量名吗? –
@Grimm。不是这样。我的问题是,为什么它不会自动为字符串/符号加上“@”。我添加了一些例子来使我的问题更清楚。 – sawa