2015-10-16 29 views
2

如果我们有一个create_widget法这样定义的:Ruby的关键字参数语法解释

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

它们都以相同的方式解释,只是语法的变体。 – Anthony

回答

6

您的所有三条线都功能相同。

哈希对象使用大括号{}声明,Ruby开始使用火箭=>配对键和值。所以当你将它传递给一个函数时声明一个将看起来像你的第一行。

create_widget(6, {:id => "table22", :class => "Cart"}) 

为了方便和简洁的语法,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") 

所以在这些情况下,差异是纯粹的视觉效果。但请注意,如果您有非符号密钥,则需要使用火箭=>语法。欢迎你到他们在相同的散列混合在一起:

create_widget(6, "id" => "table22", class: "Cart") 

另外值得注意的是,红宝石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")