Ruby:正确使用Lambdas

时间:2013-12-10 19:44:40

标签: ruby lambda singleton codeblocks instance-eval

在开始之前,我试过摆弄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代码块以获取某些内容的值。任何帮助或指向正确方向的人都将不胜感激!

3 个答案:

答案 0 :(得分: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的上下文中调用条件。

答案 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 })