使用ruby,运算符重载和instance_eval进行元编程

时间:2012-04-30 04:47:06

标签: ruby closures metaprogramming block dsl

例如我的课程如下:

class QueryDSL
  def initialize(&block)
    instance_eval &block
  end

  def ==(value)
    "bla bla '#{value}'"
  end

  def test(param)
    param + param
  end
end

和类Query一样:

class Query
  def self.where(&block)
    QueryDSL.new(&block)
  end
end

我怀疑执行时:

Query.where{test == 9}

输出应为:

"bla bla 9 bla bla 9"

但我有例外:

`test': wrong number of arguments (0 for 1) (ArgumentError)

我的代码有什么错误吗?感谢

1 个答案:

答案 0 :(得分:0)

你的问题是当你被定义为接受一个参数时,你正在调用没有参数的QueryDSL#test方法,因此

`test': wrong number of arguments (0 for 1) (ArgumentError)

错误。

更改test方法以不接受参数或具有param的默认值或在块中提供参数:

Query.where { test(6) == 9 }

但仍然无法调用==运算符,test不会返回QueryDSL实例,因此将使用==运算符返回它返回的任何内容。