gpt4 book ai didi

ruby - instance_variable_set, instance_variable_get 符号冗余

转载 作者:数据小太阳 更新时间:2023-10-29 08:53:09 24 4
gpt4 key购买 nike

当我使用某个名称设置或获取实例变量时,例如 @foo,我可以执行如下操作:

instance_variable_set("@foo", some_value)
...
instance_variable_get("@foo")

但我经常使用一个变量作为方法名称,它不包含 @ 前缀,所以我最终会这样做:

method = :foo
...
instance_variable_set("@#{method}", some_value)
...
instance_variable_get("@#{method}")

但由于所有实例变量都以 @ 为前缀,我认为必须键入 "@#{method}" 而不是简单地键入 method 是多余的。为什么方法 instance_variable_setinstance_variable_get 没有设计为接受没有 @ 作为第一个参数的字符串/符号,如下所示:

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

实际设置的变量将是 @foo 而不是 foo

这样做有什么好处吗?

最佳答案

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

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

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

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

关于ruby - instance_variable_set, instance_variable_get 符号冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com