我怎样才能知道一个班级是否有“初始化”?

时间:2014-06-19 11:44:20

标签: ruby

我有以下课程

class Logger
  def initialize(message)
    @message = message
  end
  def log
    puts @message
  end
end

当我访问在类本身而不是在继承链中定义的实例方法时,我只返回[:log]

Logger.instance_methods(false) # => [:log]

当在类中未定义initialize方法时,结果相同。我还检查了它是否在继承链中定义;它不是:

Logger.instance_methods.include?(:initialize) # => false

可以单独访问:

Logger.instance_method(:initialize) # => #<UnboundMethod: Logger#initialize>

例如访问其参数:

Logger.instance_method(:initialize).parameters # => [[:req, :opts]] 

如何获得所有已定义的方法,包括initialize

2 个答案:

答案 0 :(得分:4)

实际上initialize方法是private。因此

Logger.private_instance_methods(false)
#=> [:initialize]

Logger.private_instance_methods(false) | Logger.instance_methods(false)
#=> [:initialize, :log]

答案 1 :(得分:4)

Declaring Visibility

  

默认情况下,Ruby类中的所有方法都是公共的 - 任何人都可以访问。尽管如此, 此规则只有两个例外 :在Object类下定义的全局方法,以及任何类的initialize方法。 它们都是隐含的私有

你可以问你的,你的班级会告诉你,它是否有方法。看这个private_method_defined?

#!/usr/bin/env ruby

class Foo
  def initialize
  end
end

Foo.private_method_defined?(:initialize) # => true