gpt4 book ai didi

ruby - 了解从 Ruby 中的过程返回

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:37 24 4
gpt4 key购买 nike

我想知道如何将一个 block 传递给一个方法,这将使该方法在 yield返回

天真的方法不起作用:

def run(&block)
block.call
end

run { return :foo } # => LocalJumpError

包装在另一个过程中具有相同的效果:

def run(&block)
proc { block.call }.call
end

run { return :bar } # => LocalJumpError

所以我认为return语句绑定(bind)到当前bindingreceiver。然而,用 instance_eval 尝试证明我错了:

class ProcTest
def run(&block)
puts "run: #{[binding.local_variables, binding.receiver]}"
instance_eval(&block)
end
end

pt = ProcTest.new
binding_inspector = proc { puts "proc: #{[binding.local_variables, binding.receiver]}" }
puts "main: #{[binding.local_variables, binding.receiver]}"
# => main: [[:pt, :binding_inspector], main]
binding_inspector.call
# => proc: [[:pt, :binding_inspector], main]
pt.run(&binding_inspector)
# => run: [[:block], #<ProcTest:0x007f4987b06508>]
# => proc: [[:pt, :binding_inspector], #<ProcTest:0x007f4987b06508>]
pt.run { return :baz }
# => run: [[:block], #<ProcTest:0x007f4987b06508>]
# => LocalJumpError

所以问题是:

  1. 如何做到这一点?
  2. 返回上下文如何绑定(bind)到 return 语句。是否可以通过语言的 API 访问此连接?
  3. 这是故意以这种方式实现的吗?如果是 - 为什么?如果不是 - 解决它的障碍是什么?

最佳答案

I thought that the return statement is bound to the receiver of the current binding.

只有方法有接收者。 return 不是方法:

defined? return #=> "expression"

尝试将其作为方法调用是行不通的:

def foo
send(:return, 123)
end

foo #=> undefined method `return'

trying it out with instance_eval proved me wrong

尽管 instance_eval 在接收器的上下文中评估 block (因此您可以访问接收器实例方法和实例变量):

class MyClass
def foo(&block)
@var = 123
instance_eval(&block)
end
end

MyClass.new.foo { instance_variables }
#=> [:@var]

...它评估当前绑定(bind)中的 block (因此您无权访问任何局部变量):

class MyClass
def foo(&block)
var = 123
instance_eval(&block)
end
end

MyClass.new.foo { local_variables }
#=> []

How can this be done?

您可以使用eval,但这需要一个字符串:

def foo
var = 123
eval yield
nil
end

foo { "return var * 2" }
#=> 246

或者通过将绑定(bind)传递给 block (再次使用 eval):

def foo
var = 123
yield binding
nil
end

foo { |b| b.eval "return var * 2" }
#=> 246

关于ruby - 了解从 Ruby 中的过程返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982151/

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