如何检查`initialize`是否在类中直接定义

时间:2015-06-26 04:08:03

标签: ruby

我试图检查是否在课程中直接定义了initialize。这是一些示例命令行代码,用于说明我尝试做的事情:

class Something
  def initialize; end
end

Something.method_defined?(:initialize)
# => false 

有没有办法检测是否在类中直接定义了initialize

2 个答案:

答案 0 :(得分:6)

initialize显然总是私密的,所以你需要这样做:

Something.private_instance_methods(false).include?(:initialize)

false参数表示不搜索祖先。

文档:http://ruby-doc.org/core-2.2.2/Module.html#method-i-private_instance_methods

答案 1 :(得分:1)

你说"在"中定义,而不是"在"上定义。请考虑以下事项:

class A
  module B
    private
    def initialize; end
  end
  include B
end

A.private_instance_methods.include?(:initialize)
  #=> true 
A.private_instance_methods(false) 
  #=> [] 
A.instance_method(:initialize).owner
  #=> A::B 

如果您在initialize"中考虑A被定义"在这里,我建议你通过使用上面三个表达式中的最后一个来回答这个问题(虽然我可能会在引脚的头部跳舞)。