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

ruby – Enumerator yielder.yield VS Proc.yield

发布时间:2020-12-17 03:48:20 所属栏目:百科 来源:网络整理
导读:我最近开始阅读“Programming Ruby 1.9 2.0”一书. 它显示了显式枚举器的技巧 triangular_numbers = Enumerator.new do |yielder|number = 0count = 1 loop do number += count count += 1 yielder.yield number endend5.times { print triangular_numbers.n
我最近开始阅读“Programming Ruby 1.9& 2.0”一书.
它显示了显式枚举器的技巧

triangular_numbers = Enumerator.new do |yielder|
number = 0
count = 1
    loop do
        number += count
        count += 1
        yielder.yield number
    end
end
5.times { print triangular_numbers.next," " }
puts

我想知道为什么这个yielder.yield会暂时离开循环并返回number的值,直到创建下一个枚举器对象.它似乎与循环块内的产量的通常情况不同.我查看了APIdock,发现Proc.yield()的源代码与Proc.call()相同.对于Enumerator类中的Yielder对象,Yielder已覆盖yield().但是为什么yielder.yield会暂时离开循环块?

参考:
APIdock Yielder yield(),
Ruby MRI rb_proc_call

解决方法

您将Ruby的yield语句与Enumerator :: Yielder的yield方法和Proc的yield方法混淆.它们的拼写可能相同,但它们完全不同.

声明

yield语句没有接收者.在方法内部,它意味着“立即运行块”.如果未附加块,则会发生错误.它并不总是有一个参数,因为有时你只想运行块.

def foo
  yield :bar
end
foo # LocalJumpError
foo { |x| puts x } # bar

枚举:: Yielder

对于一个yielder来说,收益率几乎总是有争议的.那是因为它意味着和<<这是“下次有人打电话给我,给他们这个价值”.

Enumerator.new { |yielder| yielder.yield 3 }.next # 3
Enumerator.new { |yielder| yielder << 3 }.next # same thing

我认为使用<<<<<<<避免与收益率陈述混淆. PROC Procs和lambdas基本上都是函数.这里的yield意味着与调用相同的东西,即“只调用函数”.您可以给它一个参数或不参数,具体取决于proc的定义方式.没什么好看的.

proc { |x| puts x }.yield(:bar) # bar
proc { |x| puts x }.call(:bar) # same thing as previous line

我认为使用调用以避免与yield语句混淆是个好主意.

(编辑:李大同)

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

    推荐文章
      热点阅读