在开始之前,我试过摆弄instance_eval和singleton方法无济于事。我将针对这个问题展示我的“最佳”尝试。
我正在尝试执行以下操作:
value = rule(condition: lambda {@something > 100})
value.act(120)
上述电话无法更改。
可以改变的是如何定义规则:
def rule(condition: nil)
t = Object.new
t.class.module_eval{
attr_accessor :condition
def act(something)
if(condition.call(something))
return "SUCCESS"
end
end
}
t.condition = condition
return t
end
我不确定如何获取lambda代码块以获取某些内容的值。任何帮助或指向正确方向的人都将不胜感激!
答案 0 :(得分:3)
如果这些来电无法改变:
value = rule(condition: lambda {@something > 100})
value.act(120)
def rule(condition: nil)
t = Object.new
t.class.module_eval do
attr_accessor :condition
def act(something)
@something = something
if(instance_exec &condition)
"SUCCESS"
else
"FAILURE"
end
end
end
t.condition = condition
t
end
它在t
的上下文中调用条件。
答案 1 :(得分:0)
你正在定义rule
,你只是定义你的条件lambda错了。请尝试使用此代码:
value = rule(condition: lambda {|arg| arg > 100})
这告诉Ruby lambda接受一个参数。您已经在rule
函数中传递了参数。
如果您需要保持规则语法相同,(我建议不要这样做),您可以将定义更改为:
def rule(condition: nil)
t = Object.new
t.class.module_eval{
attr_accessor :condition
def act(something)
argobj = Object.new
argobj.instance_variable_set(:something, something)
if(argobj.instance_eval(&(condition())))
return "SUCCESS"
end
end
}
t.condition = condition
return t
end
答案 2 :(得分:0)
你很亲密,你的lambda需要一个参数。
def rule(condition: nil)
t = Object.new
t.class.module_eval do
attr_accessor :condition
def act(something)
if(condition.call(something))
"SUCCESS"
else
"FAILURE"
end
end
end
t.condition = condition
t
end
derp = rule(condition: lambda { |val| val > 100 })
puts derp.act(120)
puts derp.act(80)
甚至更好,变得邋!!
derp = rule(condition: ->(val) { val > 100 })