ruby - block 定义 - 大括号和 do-end 之间的区别?

标签 ruby block

谁能解释为什么下面的代码会因错误而中止

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

我确实相信大括号“{}”可以在 block 中任意替换“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 

在第一种情况下, block 被传递给 map,一切正常。 在第二种情况下,该 block 被传递给 puts,它不对其执行任何操作。 map 不接收 block ,只返回一个枚举器。

至于语法错误,如果您删除 print( 一切正常 ;) 之间的空格

不同之处在于 ruby​​ 是将括号视为方法参数定界符,还是将其视为通用语句分组。我不确定那里的确切区别,但它很微妙且令人讨厌

关于ruby - block 定义 - 大括号和 do-end 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6179442/

相关文章:

objective-c - Objective-C block 是否总是在单独的线程中执行?

ruby - ||= 在 Ruby 线程中安全吗?

ruby-on-rails - ActionMailer 实例方法像类方法一样使用

ruby - Rspec 进程在不同的地方挂起,无法终止进程。如何诊断?

ruby - open-uri + hpricot 和 nokogiri 不能正确解析 html

Hadoop - map-reduce 任务如何知道要处理文件的哪一部分?

ios - 使用ObjectiveDropboxOfficial框架获取用户信息

ruby - gem 安装错误 : 'Please specify at least one gem name'

objective-c - 使用 block 的目的是什么

php - 如何阻止浏览器调用 iframe 的内容