gpt4 book ai didi

ruby - 向 proc 产生一个 block (或创建一个方法来接受来自产生的 proc 的 block )

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

我目前正在开发一个接口(interface),该接口(interface)允许我用过程链包装任意方法调用。无需过多赘述,我目前有一个接口(interface)可以接受如下内容:

class Spy
def initialize
@procs = []
end

def wrap(&block)
@procs << block
end

def execute
original_proc = Proc.new { call_original }
@procs.reduce(original_proc) do |memo, p|
Proc.new { p.call &memo }
end.call
end

def call_original
puts 'in the middle'
end
end

spy = Spy.new
spy.wrap do |&block|
puts 'hello'
block.call
end
spy.wrap do |&block|
block.call
puts 'goodbye'
end
spy.execute

不过,我想做的是从我的 API 中删除 |&block|block.call 并改用 yield

spy.wrap do
puts 'hello'
yield
end

这不起作用并引发了 LocalJumpError: no block given (yield) 错误。

我还尝试通过在 reduce 中将 proc 传递给 define_singleton_method 来创建方法,但我没有任何运气。

def execute
original_proc = Proc.new { call_original }
@procs.reduce(original_proc) do |memo, p|
define_singleton_method :hello, &p
Proc.new { singleton_method(:hello).call(&memo) }
end.call
end

我可以使用另一种方法吗?有没有办法从 Proc 中yield 或使用 Proc 来初始化一些可以被 yield 的东西?

最佳答案

在你的 wrap block 中使用 yield 没有多大意义,除非你将一个 block 传递给调用者本身:

def foo
spy.wrap do
puts "executed in wrap from foo"
yield
end
end

如果您在没有 block 的情况下调用foo,它将引发异常,因为yield 找不到要执行的 block 。但是,如果您将一个 block 传递给 foo 方法,那么它将被调用:

foo do
puts "foo block"
end

会输出

executed in wrap from foo
foo block

总而言之,我认为您误解了 yield 的工作原理,我认为这不是您想要在此处实现的目标。

关于ruby - 向 proc 产生一个 block (或创建一个方法来接受来自产生的 proc 的 block ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29998163/

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