在关联中,我们通常会进行a :b
(belongs_to :something
)。当我们使用符号键创建哈希时,通常会执行a: b
。话虽如此,我的问题是两种语法之间的区别是什么。还有什么逻辑可以记住何时使用哪种约定?
答案 0 :(得分:10)
这与约定无关,与语法有关。
:something
是Symbol
。
belongs_to :something
是一种发送到隐式self
的方法,同时也省略了括号。我们可以将其编写为如下所示:
self.belongs_to(:something)
:something
只是传递给方法belongs_to
的参数。
在Hash
中,我们可以使用Symbol
作为密钥:
hash = { :something => "hello" }
Ruby在1.9版中引入了另一种语法,当键是符号时可以使用:
hash = { something: "hello" }
两个版本都是等效的。
答案 1 :(得分:1)
此处的区别在于方法调用和哈希键。它们看起来非常相似,如果您不确定要查找的内容,则很容易混淆。
在您的第一个示例中:
a :b
长格式为:
a(:b)
现在显然是方法(:b
)的参数(a
)。
另一种形式是不同的:
a: b
如果这是这样的方法调用的一部分:
f a: b
那实际上意味着:
f(a: b)
完整格式为:
f({ a: b })
这里是遵循key: value
样式的哈希定义。这里的:a
是键(符号),b
是值(变量或方法调用)。
您经常会在a: :b
上看到符号键和值。
要在阅读代码时区分这两种形式,请查看代码出现的位置以获得上下文感。编写代码时,请务必更清楚地根据方法调用和哈希定义来构想。