Ruby关键字参数语法解释

时间:2015-10-16 15:51:23

标签: ruby hash syntactic-sugar keyword-argument

如果我们以这种方式定义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,并呈现相同的结果。

1 个答案:

答案 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")