冒号的前置和追加之间的区别(:项目与项目:)

Aut*_*ico 7 ruby ruby-on-rails colon

在红宝石中附加和预先添加结肠有什么区别?

例:

#In rails you often have things like this:
has_many :models, dependent: :destroy
Run Code Online (Sandbox Code Playgroud)

为什么dependent:有一个附加的结肠,但:models:destroy有预谋的结肠?有什么不同?

aka*_*tos 10

这是Ruby 1.9中的一种新语法,用于定义作为哈希中键的符号.

前置和附加都:定义了a symbol,但后者仅在散列初始化期间有效.

您可以将符号视为轻量级字符串常量.

它相当于

:dependent => :destroy
Run Code Online (Sandbox Code Playgroud)

在1.9之前,使用稍微更冗长和难以键入的语法定义哈希:

hash = {
   :key => "value",
   :another_key => 4
}
Run Code Online (Sandbox Code Playgroud)

他们在1.9中简化了它:

hash = {
   key: "value",
   another_key: 4
}
Run Code Online (Sandbox Code Playgroud)

如果您要编写要在1.9之前的Ruby上使用的模块,请确保使用较旧的语法.


Per*_*heo 5

由于Ruby允许你省略括号(),在某些情况下允许花括号,{}它可能不是很明显,但上面的代码实际上是这样的:

has_many(:models, { dependent: :destroy } )

现在,它意味着has_many需要两个参数,一个是符号:,一个是不可变的字符串,如果你愿意,还有一个哈希,其中dependentdestroy是键,是值; 也可能被视为:dependent => destroy.