在表达式上调用'puts'来改变它的解释方式?

cga*_*gag 4 ruby

我刚遇到一个问题,函数返回的值是不同的,这取决于我是否调用puts对该结果.我想知道这是否是预期的,或某种解析器错误.

仅当传递给函数的块使用do...end语法而不是内联{...}语法时才会出现这种情况.这是一个例子:

arr = ["a", "b", "c"]
puts i = arr.index { |x| == "b" }
#=> 1
Run Code Online (Sandbox Code Playgroud)

正如所料,但这并不像我预期的那样有效:

arr = ["a", "b", "c"]
puts i = arr.index do |x|
  x == "b"
end
#=> #<Enumerator:0xSomeId>
Run Code Online (Sandbox Code Playgroud)

虽然如果我这样做它可以正常工作:

arr = ["a", "b", "c"]
i = arr.index do |x|
  x == "b"
end
puts i
#=> 1
Run Code Online (Sandbox Code Playgroud)

看起来它被解释为好像没有传递任何块(返回枚举器是arr.index使用块调用的预期行为).这是正常的吗?这种行为是在任何地方解释/记录的

Max*_*Max 7

do...end{...}由于优先级,块与最左边的方法关联,而块与最右边的方法关联.在您的第二个示例中,该块与之关联puts,而不会对其执行任何操作.

在这种情况下,这似乎是奇怪的行为,但是这个do...end块的这个特性为Ruby DSL提供了干净,可读的语法.