【问题标题】:Redundancy of notation in instance_variable_set, instance_variable_getinstance_variable_set、instance_variable_get 中的符号冗余
【发布时间】:2011-10-09 22:30:36
【问题描述】:

当我使用某个名称(例如 @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

这种方式有什么优势吗?

【问题讨论】:

  • 使用instance_variable_(get|set) 不是代码味道吗?
  • :"hello?" 是一个有效的符号 - 它是一个有效的变量名吗?
  • @Grimm。它不是。我的问题是,为什么它没有设计为自动在字符串/符号前加上“@”。我添加了示例以使我的问题更清楚。
  • 如果有一些有效的符号会被转换成无效的实例变量名,这可能是一个原因吗?
  • @Grimm 我想过,但如果它总是在没有@ 的情况下使用,那么就没有问题了。我想知道为什么它不能像attr_(accessor|reader|writer),你不放@

标签: ruby


【解决方案1】:

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

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

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

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

【讨论】:

  • 也许这归结为哲学上的差异。
  • 我认为更多的是语义。希望我更新后的答案更清楚(并且还引入了另一个可能的原因)。
  • 我不相信你原来的答案,但更新的部分让我信服。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多