2009-01-07 107 views
9

我提取简单的例子:红宝石块和括号的参数

require 'pp' 
x = 1..3 
pp x.map do |i| {:value => i, :double => (i*2)} end 
pp x.map { |i| {:value => i, :double => (i*2)} } 

pp(x.map do |i| {:value => i, :double => (i*2)} end) 
pp(x.map { |i| {:value => i, :double => (i*2)} }) 

我想知道为什么第一页生产:

[1, 2, 3] 

虽然所有的oders是给:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}] 

我假定它与运算符优先级有关。我在哪里可以找到很好的解释?

+2

这是[Ruby Block Syntax Error](http://StackOverflow.Com/q/6854283/)的副本,[传递给`each`的代码块与括号但是不能与`do`-`end(ruby)](http://StackOverflow.Com/q/6718340/),[块定义 - 大括号和``````end`之间的区别?](http:/ /StackOverflow.Com/q/6179442/),[没有`do``结尾的Ruby多行块]](http://StackOverflow.Com/q/3680097/),[使用`do`块vs括号`{} ](http://StackOverflow.Com/q/2122380/)和[这些块代码风格在Ruby中的区别或价值是什么?](http://StackOverflow.Com/q/533008/)。 – 2011-07-28 08:19:01

+0

在此发布日期使用Ruby-2.2.0进行pry会话的部分内容。 pp_hash = x.map do | i | {:value => i,:double =>(i * 2)} end => [{:value => 1,:double => 2},{:value => 2,:double => 4} ,{:value => 3,:double => 6}] pp_hash.join(“,”) “{:value => 1,:double => 2},{:value => 2, double => 4},{:value => 3,:double => 6}“ 这可能更适合Json的今天使用,但这只是读取输出的风格问题。有时,只要你的代码能够处理正确的类型,你会传递哪一个并不重要。 pp_hash = pp_hash.join(“,”) – 2015-02-18 18:29:26

回答

14

这是因为你调用

pp x.map 

,并传递到第一个块(这可以忽略它)

正如Programming Ruby

牙套具有较高的优先级解释;有很低的优先级

因此,有效地,大括号与最接近它们的函数调用(x.map)绑定,而绑定最远(pp)。这有点简单但它应该解释这种情况