gpt4 book ai didi

ruby - 如何将 Ruby 迭代器作为参数传递?

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:04 25 4
gpt4 key购买 nike

我想编写一个在一个地方产生值的方法,并将它作为参数传递给另一个将使用 block 调用它的方法。我相信它可以完成,但不知何故我无法找到正确的语法。

这里有一些示例(非工作)代码来说明我正在努力实现的目标:

def yielder
yield 1
yield 2
yield 3
end

def user(block)
block.call { |x| puts x }
end

# later...
user(&yielder)

$ ruby x.rb
x.rb:2:in `yielder': no block given (yield) (LocalJumpError)
from x.rb:12:in `<main>'

FWIW,在我的真实代码中,yielder 和 user 在不同的类中。


更新

感谢您的回答。正如 Andrew Grimm 提到的,我希望迭代器方法采用参数。我原来的例子遗漏了这个细节。此代码段提供了一个迭代器,它可以计数到给定的数字。为了让它工作,我明确了内部 block 。它做了我想要的,但有点难看。如果有人可以对此进行改进,我将非常有兴趣了解如何改进。

def make_iter(upto)
def iter(upto, block)
(1 .. upto).each do |v|
block.call(v)
end
end
lambda { |block| iter(upto, block) }
end

def user(obj)
obj.call Proc.new { |x| puts x }
end

# later...
user(make_iter(3))

最佳答案

这不使用 lambda 或未绑定(bind)方法,但这是最简单的方法...

def f
yield 1
yield 2
end

def g x
send x do |n|
p n
end
end

g :f

关于ruby - 如何将 Ruby 迭代器作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com