0

在开始之前,我尝试摆弄 instance_eval 和单例方法,但无济于事。我将介绍我在这个问题上的“最佳”尝试。

我正在尝试执行以下操作:

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 代码块来获取某物的价值。任何帮助或指向正确方向将不胜感激!

4

3 回答 3

3

如果这些调用不能改变:

value = rule(condition: lambda {@something > 100})
value.act(120)

尝试instance_exec

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's 上下文中的条件。

于 2013-12-10T20:06:32.593 回答
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
于 2013-12-10T19:53:48.180 回答
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 })
于 2013-12-10T19:54:12.677 回答