当我使用某个名称设置或获取实例变量时,例如@foo
,我可以执行以下操作:
instance_variable_set(“@ foo”,some_value)
...
instance_variable_get( “@ foo” 的)
但是,我经常使用一个变量作为方法名称,该变量不包含@
前缀,因此我最终会这样做:
方法=:foo
...
instance_variable_set(“@#{method}”,some_value)
...
instance_variable_get( “@#{方法}”)
但由于所有实例变量都以@
为前缀,我认为必须输入"@#{method}"
而不是简单地键入method
是多余的。为什么方法instance_variable_set
和instance_variable_get
没有设计为接受字符串/符号而不使用@
作为第一个参数,如下所示:
方法=:foo
...
instance_variable_set(method,some_value)
...
instance_variable_get(方法)
其中要实际设置的变量是@foo
而不是foo
?
它的方式有什么优势吗?
答案 0 :(得分:3)
原因很简单,实例变量名为@foo
,而不是foo
。 @
是变量名称的部分,就像$
是全局变量名称$foo
的一部分一样。
调用@
和朋友时不需要attr_accessor
的原因是因为他们定义了属性方法,所以提供方法名称而不是变量是有意义的名。
当然没有技术原因instance_variable_set
无法在@
之前添加。但是,该方法接受与变量名对应的符号。符号按定义表示具有给定名称的标识符。因此,与实例变量@foo
对应的唯一符号为:@foo
。这就是 包含@
的原因,因为我们知道:foo
根本不对应任何实例变量标识符。 (如果你提供一个字符串,它将首先在内部转换为符号。)
更新:在C Ruby实施(MRI)中,实际上code that handles instance variables中没有提到@
。只有parser知道实例变量以@
开头。因此,似乎将代码解析与实现分离是另一个可能的原因。