冗余在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_setinstance_variable_get没有设计没有@接受串/符号作为第一个参数是这样的方法:

方法=:FOO
...
instance_variable_set(方法,SOME_VALUE)
.. 。
instance_variable_get(方法)

其中变量要被实际设定将@foo而非foo

它的方式有什么优势吗?

+1

没有使用'instance_variable_(get | set)'代码味道? –

+0

':“你好吗?”'是一个有效的符号 - 它是一个有效的变量名吗? –

+0

@Grimm。不是这样。我的问题是,为什么它不会自动为字符串/符号加上“@”。我添加了一些例子来使我的问题更清楚。 – sawa

原因很简单,实例变量名为@foo,而不是foo@部分的变量名称,正如$是全局变量名称$foo的一部分。

之所以@调用attr_accessor和朋友的时候是没有必要的,因为它们定义属性的方法,因此是很有意义提供方法名称,而不是变量名。

当然没有技术原因instance_variable_set不能预先设定@本身。但是,该方法接受对应于变量名称的符号。符号由定义表示具有给定名称的标识符。所以对应于实例变量@foo只有符号是:@foo。这就是为什么你包括@,因为我们知道:foo根本不对应任何实例变量标识符。 (如果你提供一个字符串,它将首先在内部转换为符号。)

更新:在C Ruby实现(MRI)中,实际上在code that handles instance variables的任何地方都没有提及@。只有parser知道实例变量以@开头。所以看起来,将代码与实现分离是另一个可能的原因。

+0

也许这归结为哲学上的差异。 – sawa

+0

我认为这更多关于语义。希望我的更新答案能够使它更加清晰(并且还介绍了另一个可能的原因)。 – molf

+0

我不相信你的原始答案,但更新的部分让我信服。谢谢。 – sawa