如何解决块定义-括号和结束符之间的区别?
| 任何人都可以解释为什么以下代码因错误而中止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
我确实相信大括号\“ {} \”可以在方块中任意替换\“ do end \”
定义。
我知道我可以通过省略打印之间的空格来“修复”第一个调用
方法和第一个括号,但我对解释感兴趣
为什么表现不同。
解决方法
区别在于优先级:
# 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
和(
之间的空格,则一切正常;)
区别在于ruby是将括号作为方法参数定界符,还是作为通用语句分组。我不确定那里的确切区别,但是那是微妙而烦人的
, SO已经有了一个最终答案。
不幸的是,这绝对不是Ruby背后令人吃惊的哲学的良好证明。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。