instance_variable_set,instance_variable_get中的表示法冗余

时间:2011-10-09 22:30:36

标签: ruby

当我使用某个名称设置或获取实例变量时,例如@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_setinstance_variable_get没有设计为接受字符串/符号而不使用@作为第一个参数,如下所示:

  

方法=:foo
  ...
  instance_variable_set(method,some_value)
  ...
  instance_variable_get(方法)

其中要实际设置的变量是@foo而不是foo

它的方式有什么优势吗?

1 个答案:

答案 0 :(得分:3)

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

调用@和朋友时不需要attr_accessor的原因是因为他们定义了属性方法,所以提供方法名称而不是变量是有意义的名。

当然没有技术原因instance_variable_set无法在@之前添加。但是,该方法接受与变量名对应的符号。符号按定义表示具有给定名称的标识符。因此,与实例变量@foo对应的唯一符号为:@foo。这就是 包含@的原因,因为我们知道:foo根本不对应任何实例变量标识符。 (如果你提供一个字符串,它将首先在内部转换为符号。)

更新:在C Ruby实施(MRI)中,实际上code that handles instance variables中没有提到@。只有parser知道实例变量以@开头。因此,似乎将代码解析与实现分离是另一个可能的原因。