Ruby 关键字参数语法解释
Ruby keyword arguments syntax explanation
如果我们有一个这样定义的create_widget
方法:
def create_widget(size, properties)
puts properties.class #=> Hash
puts properties[:id] #=> table22
end
有什么区别:
create_widget(6, {:id => "table22", :class => "Cart"})
create_widget(6, :id => "table22", :class => "Cart")
create_widget(6, id: "table22", class: "Cart")
在任何情况下,第二个参数都是 Hash
,并呈现相同的结果。
您的所有三行在功能上都是相同的。
哈希对象使用大括号 {}
声明,并且 Ruby 开始使用火箭 =>
配对键和值。所以在将它传递给函数时声明一个看起来就像你的第一行。
create_widget(6, {:id => "table22", :class => "Cart"})
为了方便和简洁的语法,如果 Hash 是最后一个参数,Ruby 允许您省略 {}
,这会得到第 2 行。这是许多接受一些方法的常用习惯用法额外选项哈希的种类:
def create_widget(number, properties = {}); end
create_widget(6, :id => "table22", :class => "Cart")
Ruby 1.9 引入了冒号 :
语法来替换火箭 =>
当您的键是符号时 ,导致第 3 行:
create_widget(6, id: "table22", class: "Cart")
所以在这些情况下,差异纯粹是视觉上的。请注意,如果您有非符号键,则需要使用 rocket =>
语法。欢迎您将它们混合在同一个哈希中:
create_widget(6, "id" => "table22", class: "Cart")
另外值得注意的是,Ruby 2 引入了关键字参数,它看起来与第 3 行相同。除了人们从选项哈希中获取的描述性名称之外,关键字参数还为您提供了排序灵活性。与选项散列相比,它们还可以让您更轻松地设置默认值,因此 create_widget
可能如下所示:
def create_widget(number, id:, class: "Cart")
id:
声明我们已将参数命名为 id
,并且它没有默认值,因此它是必需的。另一方面,class: "Cart"
将默认为 "Cart"
,因此是可选的。现在所有这些调用的行为都相同:
create_widget(6, id: "table22")
create_widget(6, id: "table22", class: "Cart")
create_widget(6, class: "Cart", id: "table22")
如果我们有一个这样定义的create_widget
方法:
def create_widget(size, properties)
puts properties.class #=> Hash
puts properties[:id] #=> table22
end
有什么区别:
create_widget(6, {:id => "table22", :class => "Cart"})
create_widget(6, :id => "table22", :class => "Cart")
create_widget(6, id: "table22", class: "Cart")
在任何情况下,第二个参数都是 Hash
,并呈现相同的结果。
您的所有三行在功能上都是相同的。
哈希对象使用大括号 {}
声明,并且 Ruby 开始使用火箭 =>
配对键和值。所以在将它传递给函数时声明一个看起来就像你的第一行。
create_widget(6, {:id => "table22", :class => "Cart"})
为了方便和简洁的语法,如果 Hash 是最后一个参数,Ruby 允许您省略 {}
,这会得到第 2 行。这是许多接受一些方法的常用习惯用法额外选项哈希的种类:
def create_widget(number, properties = {}); end
create_widget(6, :id => "table22", :class => "Cart")
Ruby 1.9 引入了冒号 :
语法来替换火箭 =>
当您的键是符号时 ,导致第 3 行:
create_widget(6, id: "table22", class: "Cart")
所以在这些情况下,差异纯粹是视觉上的。请注意,如果您有非符号键,则需要使用 rocket =>
语法。欢迎您将它们混合在同一个哈希中:
create_widget(6, "id" => "table22", class: "Cart")
另外值得注意的是,Ruby 2 引入了关键字参数,它看起来与第 3 行相同。除了人们从选项哈希中获取的描述性名称之外,关键字参数还为您提供了排序灵活性。与选项散列相比,它们还可以让您更轻松地设置默认值,因此 create_widget
可能如下所示:
def create_widget(number, id:, class: "Cart")
id:
声明我们已将参数命名为 id
,并且它没有默认值,因此它是必需的。另一方面,class: "Cart"
将默认为 "Cart"
,因此是可选的。现在所有这些调用的行为都相同:
create_widget(6, id: "table22")
create_widget(6, id: "table22", class: "Cart")
create_widget(6, class: "Cart", id: "table22")