加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:47:01 所属栏目:百科 来源:网络整理
导读:我刚遇到一个问题,函数返回的值是不同的,这取决于我是否对该结果调用puts.我想知道这是否是预期的,或某种解析器错误. 只有传递给函数的块使用do … end语法而不是内联{…}语法时才会出现这种情况.这是一个例子: arr = ["a","b","c"]puts i = arr.index { |x
我刚遇到一个问题,函数返回的值是不同的,这取决于我是否对该结果调用puts.我想知道这是否是预期的,或某种解析器错误.

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

arr = ["a","b","c"]
puts i = arr.index { |x| == "b" }
#=> 1

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

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

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

arr = ["a","c"]
i = arr.index do |x|
  x == "b"
end
puts i
#=> 1

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

解决方法

do … end blocks与最左边的方法关联,而{…}块与最右边的方法关联,由于优先级.在你的第二个例子中,块与puts相关联,它对它没有任何作用.

在这种情况下,这似乎是奇怪的行为,但这就是do … end block的这个特性,它为Ruby DSL提供了清晰,可读的语法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读