Ruby: 方法接受 {} 和 do...end 的优先顺序

在ruby中方法都可以接收一段匿名的block代码,申明block的方式为{}do...end{}对方法的绑定关系上强于do...end

例如:

下面代码可以得到想要的结果,代码块绑定在map方法上

names = ['bRUce', 'STaN', 'JOlIE']
print names.map { |name| name.downcase }
# => ["bruce", "stan", "jolie"]

下面代码则输出了一个Enumerator对象,do...end绑定在了print方法上

names = ['bRUce', 'STaN', 'JOlIE']
print names.map do |name| name.downcase end
# => #<Enumerator:0x00007fe0abe878d8>

# 这样也是相同的
print(names.map) { |name| name.downcase }

# 避免这样的错误
print(names.map do |name| name.downcase end)

参考

Ruby blocks: Braces and do/end have different precedence