如果我们以这种方式定义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
,并呈现相同的结果。
答案 0 :(得分:6)
你的所有三行在功能上完全相同。
使用大括号{}
声明散列对象,Ruby开始将键和值与火箭=>
配对。因此,当您将其传递给函数时声明一个看起来就像是您的第一行。
create_widget(6, {:id => "table22", :class => "Cart"})
为了方便和干净的语法,Ruby允许你省略{}
如果Hash是最后一个参数,它会让你获得第2行。这是许多接受某种额外选项hash的方法的常用习惯用法:
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")