繁体   English   中英

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

[英]Metaprogramming with ruby, operator overloading and instance_eval

例如,我上课像:

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

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

  def test(param)
    param + param
  end
end

和类查询,如:

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)

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

您的问题是,当定义为采用一个参数时,您正在调用不带参数的QueryDSL#test方法,因此

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

错误。

更改test方法以不接受参数,或者为param设置默认值,或者在块中提供参数:

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

尽管这仍然不会调用您的==运算符,但是test不会返回QueryDSL实例,因此将使用==运算符返回所返回的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM