gpt4 book ai didi

ruby-on-rails - 在调用期间更改 `Proc` 绑定(bind)

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:05 26 4
gpt4 key购买 nike

是否可以在调用期间更改过程的绑定(bind)?

class AllValidator
def age_validator
Proc.new {|value| self.age > value }
end
end

class Bar
attr_accessor :age
def doSomething
validator = AllValidator.new.age_validator
validator.call(25) # How to pass self as the binding?
end
end

在上面的代码中,我如何在调用期间更改 proc 的绑定(bind)?有没有一种方法可以像 eval 函数一样传递绑定(bind)?

注意如果上面的例子是真实的,我会使用 mixin/inheritence 等。我正在使用代码来演示我的问题场景。

最佳答案

您可以使用 instance_eval :

class Bar
def do_something
validator = AllValidator.new.age_validator

# Evaluate validator in the context of self.
instance_eval &validator
end
end

如果你想传递参数(如下评论中提到的),你可以使用instance_exec如果您使用 Ruby 1.9 或 Ruby 1.8.7,则代替 instance_eval:

class Bar
def do_something
validator = AllValidator.new.age_validator

# instance_exec is like instance_eval with arguments.
instance_exec 5, &validator
end
end

如果您还必须使其与 Ruby 1.8.6 及更低版本一起使用,最好的办法是将 proc 绑定(bind)为 Bar 的方法:

class Bar
def do_something
self.class.send :define_method, :validate, &AllValidator.new.age_validator
self.validate 5
end
end

另一种方法是实现 instance_exec 较旧的 Ruby 版本 ( example here )。它所做的只是在调用之前定义一个方法,并在完成后取消定义它。

关于ruby-on-rails - 在调用期间更改 `Proc` 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2361138/

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