任何人都可以解释为什么以下代码中止错误
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>'
Run Code Online (Sandbox Code Playgroud)
而具有相同功能的以下代码是否按预期工作?
irb(main):187:0> print ((1..10).collect { |x| x**2 })
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]=> nil
Run Code Online (Sandbox Code Playgroud)
我确实认为花括号"{}"可以在块定义中任意替换"do end".
我知道我可以通过省略print方法和第一个括号之间的空格来"修复"第一个调用,但我对解释它为什么表现不同感兴趣 .
Gar*_*eth 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
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,块被传递给map,一切正常.在第二种情况下,块被传递给puts,它不会对它做任何事情.map没有收到一个块,只返回一个枚举器.
至于语法错误,如果你删除之间的空间print,(一切正常;)
区别在于ruby是否将括号视为方法参数分隔符,或者它是否是通用语句分组.我不确定那里的确切差异,但它是微妙和烦人的
| 归档时间: |
|
| 查看次数: |
2167 次 |
| 最近记录: |