2009-05-27 66 views
3

这两个语句是否将相同类型的参数(哈希)传递给新方法?Ruby Hashes的括号语法

@seat = Seat.new(:flight_id => @flight.id) 

@seat = Seat.new({:flight_id => @flight.id}) 

哈希括号{}在第二个示例中更改了什么吗?

回答

12

它们都是相同的,{}在第二个参数中没有添加任何内容,除了使事情比以前更加明确外(使用=>语法足以向使用任何人的人说'这是一个散列'红宝石任何时间长度)。

红宝石会自动开启的参数列表,如:

someFunction(:arg1 => value1, :arg2 => value2) 

成散列,并且把它作为你的一个参数。需要在散列周围添加散列的时间是当散列的散列或需要两个散列的函数(如需要传递选项和html_options的多个导航方法)时,如下所示:

someFunction({:arg1 => value1, :arg2 => value2}, {:arg3 => value3}) 

它将传入两个哈希值(解释器无法推断出2个哈希值如果留给它自己的位置,所以您需要给它{}来告诉它在这种情况下该怎么做)

有关更多信息,请参阅Pickaxe书籍章节:More About Methods,位于底部的收集散列参数部分。

1

这似乎是一个好地方,何况另一个替代语法,使用逗号分隔项目括号(使用范例):

@seat = Seat.new({:flight_id, @flight.id}) 

我通常不使用逗号语法标准码 - - 就像workmad3所说的那样,箭头(=>)使散列更加明显。但是在一个交互的Ruby会话(IRB),更容易键入一个逗号,不是箭头:

{:eyes, "blue", :height, 6.2} # => {:height=>6.2, :eyes=>"blue"} 

而且在Ruby 1.9中,惯用的版本有更少的逗号:

{eyes: "blue", height: 6.2} 
+0

呀记第二个例子中的语法已经在所有可行的ruby版本中被删除(1.8版即将发布) – 2013-03-28 18:16:12