Ruby 呼叫';看跌期权';关于一个表达式改变它的方式';翻译什么?

Ruby 呼叫';看跌期权';关于一个表达式改变它的方式';翻译什么?,ruby,Ruby,我刚刚遇到了一个问题,即函数返回的值根据我调用的结果是否不同而不同。我想知道这是意料之中的,还是某种解析器错误 仅当传递给函数的块使用do…end语法,而不是内联{…}语法时,才会发生这种情况。下面是一个例子: arr = ["a", "b", "c"] puts i = arr.index { |x| == "b" } #=> 1 正如预期的那样,但这并不像我预期的那样有效: arr = ["a", "b", "c"] puts i = arr.index do |x| x ==

我刚刚遇到了一个问题,即函数返回的值根据我调用的结果是否不同而不同。我想知道这是意料之中的,还是某种解析器错误

仅当传递给函数的块使用
do…end
语法,而不是内联
{…}
语法时,才会发生这种情况。下面是一个例子:

arr = ["a", "b", "c"]
puts i = arr.index { |x| == "b" }
#=> 1
正如预期的那样,但这并不像我预期的那样有效:

arr = ["a", "b", "c"]
puts i = arr.index do |x|
  x == "b"
end
#=> #<Enumerator:0xSomeId>

它看起来被解释为根本没有传递任何块(返回枚举数是调用
arr.index
with block的预期行为)。这正常吗?是否在任何地方解释/记录了此行为?

do…end
块与最左边的方法关联,而
{…}
块由于优先级而与最右边的方法关联。在第二个示例中,该块与
put
关联,这与它无关


在这种情况下,这似乎是一种奇怪的行为,但正是
do…end
块的这一特性为许多Ruby提供了干净、可读的语法。

{…}
do>绑定得更紧密。。。结束
,这样你的
就可以。。。结束
块最后附加到
IO#put
(忽略它)而不是
数组#索引

如果将then parens放入
put()调用中
,您可以看到:

puts(i = arr.index do |x| x == 'b' end)

这是因为
{…}
的优先级高于
do。。。结束
,请参阅:使用
arr.index(“b”)
,这样您就不用担心了:)通常这不是问题,因为每一行都应该执行特定的操作。将太多的内容组合在一起不仅会使其他开发人员感到困惑,还会使解析器感到困惑。
puts(i = arr.index do |x| x == 'b' end)