2011-05-30 33 views
9

有谁能够解释为什么下面的代码有错误块定义 - 大括号和do-end之间的区别?

irb(main):186:0> print ((1..10).collect do |x| x**2 end) 
SyntaxError: (irb):186: syntax error, unexpected keyword_do_block, 
expecting ')' 
print ((1..10).collect do |x| x**2 end) 
         ^
(irb):186: syntax error, unexpected keyword_end, expecting $end 
print ((1..10).collect do |x| x**2 end) 
            ^
     from /usr/bin/irb:12:in `<main>' 

,而在与相同的功能代码的作品如预期终止?

irb(main):187:0> print ((1..10).collect { |x| x**2 }) 
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]=> nil 

我也相信大括号“{}”可以代替“做终端”随意在块 定义。

我知道我可以省略打印 方法和第一个括号之间的空间“修复”第一个电话,但我一个解释 很感兴趣,为什么它的行为不同。

+0

另请参见[类似问题的前提](http://stackoverflow.com/questions/2122380/using-do-block-vs-brackets)。 – Zabba 2011-05-30 18:20:14

+0

这是[Ruby Block Syntax Error](http://StackOverflow.Com/q/6854283/)的副本,[传递给'each'的代码块与括号一起使用,但不与'do'-'end'一起使用(ruby )](http://StackOverflow.Com/q/6718340/),[没有'do''end的Ruby多行块]](http://StackOverflow.Com/q/3680097/),[使用'do'块vs括号'{}'](http://StackOverflow.Com/q/2122380/),[Ruby中这些块编码风格的区别或价值是什么?](http://StackOverflow.Com/q/533008 /)和[Ruby块和非自私参数](http://StackOverflow.Com/q/420147/)。 – 2011-07-28 08:17:09

+0

@coreyward:Y U回滚? – 2011-09-21 00:00:29

回答

13

不同的是优先级:

# Equivalent to puts((1..10).map { |i| i*2 }) 
> puts (1..10).map { |i| i*2 } 
2 
4 
6 
8 
10 
12 
14 
16 
18 
20 
=> nil 

# Equivalent to puts((1..10).map) { |i| i*2 } 
> puts (1..10).map do |i| i*2 end 
#<Enumerator:0x928f24> 
=> nil 

在第一种情况下,该块被传递给map,一切工作正常。 在第二种情况下,该块将传递给puts,该块不会执行任何操作。 map没有收到一个块,只是返回一个枚举器。

至于语法错误,如果删除之间print(一切工作的空间;)

不同的是红宝石是否处理您的括号作为方法参数的分隔符,或者它是否是一个通用的语句分组。我不确定那里的确切区别,但它很微妙和烦人

+0

你的第二个例子与问题中的不同。 – sawa 2011-05-30 19:31:10

+0

是的,这只是一个优先的演示,而不是一个直接的解决方案。对不起,如果不明确 – Gareth 2011-05-30 19:36:21

0

有一个终极answer已经在SO上。

不幸的是,这绝对是而不是很好的证明了Ruby背后的惊喜哲学。

相关问题