gpt4 book ai didi

ruby - Proc.new 绑定(bind)变化和循环逻辑抽象

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

我在两种看起来非常相似的不同方法中有两个循环。我想在 Proc.new

中抽象他们的大部分逻辑

这行得通

def matches_base?
proc_exec = Proc.new do |subclass, breakpoint|
# next and return are meant to act inside the loop and quit it if needed
response = process_match(subclass)
next if response == :continue
return true if response == false

return response
end

subclasses(BASE_NAMESPACE).each do |subclass|
proc_exec.call(subclass)
end
false
end

这里明显的问题是 proc_exec 是在方法本身内部定义的,但我想在另一个方法中使用它

def matches_breakpoints?
breakpoints.fetch.each do |breakpoint|
# I want to include the proc_exec here too
end
false
end

所以我只是试着像这样在类级别提取它

这不起作用

def proc_exec
Proc.new do |subclass, breakpoint|
response = process_match(subclass)
next if response == :continue
return true if response == false

return response
end
end

def matches_base?
subclasses(BASE_NAMESPACE).each do |subclass|
proc_exec.call(subclass)
end
false
end

然后我可以在两个实例方法中调用它,如 proc_exec.call。目前它抛出

 LocalJumpError:
unexpected return

我尝试了很多技巧,例如 instance_evalinstance_exec 都没有成功。我现在没有解决方案。


下面是我想要的易于执行的简化示例。

class MyLoops
def proc_exec
Proc.new do |num|
next if num == 1
# we want this `return` to act in the method context
# as it would do if I defined it inside a method directly
return if num == 4
puts "Current number : #{num}"
end
end

def method_a
[0,1,2].each do |num|
proc_exec.call(num)
end
false
end

def method_b
[3,4,5].each do |num|
proc_exec.call(num)
end
end
# this `false` below should never be reached ; that's the trick
false
end

loops = MyLoops.new
loops.method_a
loops.method_b

最佳答案

你不能既吃蛋糕又吃蛋糕。如果你想要return从 proc 中止方法,它必须在方法的词法范围内*(这是“它必须在同一方法中定义”的另一种说法)。

另一种方法是让 proc/lambda 返回一个“停止”值,调用者将使用该值来中止其执行。

(不幸的是,您对 instance_eval/instance_exec 的实验被误导了。这些方法只改变了当前的 self 。这个问题与当前的 self 无关,而是当前的词法范围,return 在其中执行。 )


* 您遇到的错误是由 return 引起的试图从不再运行的方法 (proc_exec) 返回。

关于ruby - Proc.new 绑定(bind)变化和循环逻辑抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47286673/

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