Ruby 实例变量集、实例变量集和实例获取中的符号冗余

Ruby 实例变量集、实例变量集和实例获取中的符号冗余,ruby,Ruby,当我使用某些名称设置或获取实例变量时,例如@foo,我可以执行以下操作: 实例变量集(@foo),一些值) … 实例变量获取(@foo) 但是,我经常使用一个变量作为方法名,它不包括@前缀,因此我最终会执行以下操作: 方法=:foo … 实例变量集(“@#{method}”,某些值) … 实例_变量_get(“@#{method}”) 但由于所有实例变量都以@作为前缀,我认为必须键入“@#{method}”而不是简单地键入method是多余的。为什么方法instance\u variable\u

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

实例变量集(@foo),一些值)

实例变量获取(@foo)

但是,我经常使用一个变量作为方法名,它不包括
@
前缀,因此我最终会执行以下操作:

方法=:foo

实例变量集(“@#{method}”,某些值)

实例_变量_get(“@#{method}”)

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

方法=:foo

实例变量集(方法,某些值)

实例\变量\获取(方法)

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


这种方式有什么好处吗?

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

调用
attr\u accessor
和friends时不需要
@
的原因是它们定义了属性方法,因此提供方法名而不是变量名是有意义的

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


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

没有使用
实例变量(get | set)
代码气味?
:“你好?”
是一个有效的符号-它是一个有效的变量名吗?@Grimm。事实并非如此。我的问题是,为什么不设计为自动在字符串/符号前面加“@”前缀。我添加了一些示例以使我的问题更清楚。如果有一些有效的符号会转换为无效的实例变量名,这可能是一个原因吗?@Grimm我考虑过这一点,但是如果它总是在没有
@
的情况下使用,那么就不会有问题。我想知道为什么它不能像
attr|u(accessor | reader | writer)
,在那里你不放
@
。也许这可以归结为哲学上的不同。我认为更多的是关于语义。希望我更新后的答案能让它更清楚(同时也介绍了另一个可能的原因)。我不相信你原来的答案,但更新后的部分让我信服。谢谢