【发布时间】:2009-03-03 20:44:24
【问题描述】:
我在哪里可以找到关于 => 运算符在 Ruby 中的含义的解释?
例如,
class Acct < ActiveRecord::Base
validates_confirmation_of :password, :email_address, :on => :create
end
在这种情况下=> 运算符在做什么?
【问题讨论】:
我在哪里可以找到关于 => 运算符在 Ruby 中的含义的解释?
例如,
class Acct < ActiveRecord::Base
validates_confirmation_of :password, :email_address, :on => :create
end
在这种情况下=> 运算符在做什么?
【问题讨论】:
符号“=>”不是运算符。它只是一种语法手段,表示其他两个元素之间存在“键值”关系。它用于定义哈希(或关联数组,因为它们在其他一些语言中被称为,例如 PHP)。从这个意义上说,因为“=>”它不是一个运算符,所以它什么都不做(所以符号“[”和“]”在定义数组时什么也不做)。如果您仍然感到困惑,请查看 Hash Ruby 类并将其与 Array 类进行比较。
【讨论】:
符号不是运算符,只是用于定义文字 Hash 对象的语法的一部分。它通常被称为哈希火箭。
通常,字面量哈希对象的定义如下:
a = { :x => 1, :y => 2 } # same thing as: a = Hash.new; a[:x] = 1; a[:y] = 2
当然可以传递给方法:
def f(x); end; f({:x => 1, :y => 2})
碰巧的是,当哈希作为最后一个参数传递给方法时,可以删除对象字面量的{} 部分:
f(:x => 1, :y => 2)
括号也是可选的,所以我们得到如下内容:
f :x => 1:, :y => 2 # and of course...
validates_confirmation_of :password, :email_address, :on => :create
最后(仅在现代 Ruby 中)对于哈希键是符号的特定情况,您可以编写 key : value,所以:
f x: 1, y: 2 # not to mention...
validates_confirmation_of :password, :email_address, on: :create
请注意,方法调用可以在类定义中进行。它们像任何其他方法调用一样被执行,但在定义时执行。它们对于像 Rails 这样进行大量元编程以扩展其应用程序域的语言和库对象的包特别有用。
【讨论】:
要扩展已接受的答案(它不是运算符),请基本上将其视为与逗号相同的方式。
{ "foo" => "bar", "a" => "b" }
逗号分隔散列中的每一对,=> 分隔对内的键和值。
【讨论】: