Thursday, September 04, 2008

Ruby methods


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  class Demo

   4    def self.class_method

   5    end

   6    def public_method

   7    end

   8    private

   9    def private_method

  10    end

  11    protected

  12    def protected_method

  13    end

  14    class << self

  15      def class_singleton_method

  16      end

  17    end

  18  end

  19  

  20  

  21  m1 = Demo.methods.select{ |m| m =~ /methods/ } # => ["public_methods", "methods", "instance_methods", "singleton_methods", "public_instance_methods", "protected_methods", "protected_instance_methods", "private_methods", "private_instance_methods"]

  22  

  23  demo = Demo.new

  24  m2 = demo.methods.select{ |m| m =~ /methods/ } # => ["public_methods", "methods", "singleton_methods", "protected_methods", "private_methods"]

  25  

  26  puts "<Methods for Demo class>"

  27  m1.map { |m| [m, Demo.send(m,false)] }.each { |k,v| puts "#{k} -> #{v}" }

  28  puts "\n<Methods for demo object>"

  29  m2.map { |m| [m, demo.send(m,false)] }.each { |k,v| puts "#{k} -> #{v}" }


OUTPUT:

<Methods for Demo class>
instance_methods -> [:public_method, :protected_method]
public_instance_methods -> [:public_method]
protected_instance_methods -> [:protected_method]
private_instance_methods -> [:private_method]
methods -> [:class_method, :class_singleton_method]
singleton_methods -> [:class_method, :class_singleton_method]
protected_methods -> []
private_methods -> [:inherited, :initialize, :initialize_copy]
public_methods -> [:class_method, :class_singleton_method, :allocate, :new, :superclass]

<Methods for demo object>
methods -> []
singleton_methods -> []
protected_methods -> [:protected_method]
private_methods -> [:private_method]
public_methods -> [:public_method]

以上より以下のことが分かった
  • methods:自分が使えるメソッドを返す。falseの場合selfメソッド(Singletonメソッド)のみを返す(singletonメソッドと同じ)
  • singleton_methods:そのSingletonメソッドを返す
  • public_methods, protected_methods:自分が使えるメソッドを返す。つまりそのオブジェクトのクラスに定義されているpublic_instance_methodsおよびprotected_instance_methodsを返す。クラスにおいてmethods=public_methods+protected_methodsである。falseの場合はそのクラスへの継承メソッドは含まない。
  • private_methods:そのオブジェクトのクラスに定義されているprivate_instance_methodsを返す
  • instance_methods, public_instance_methods, protected_instance_methods, private_instance_methods:クラスオブジェクト(もジュールを含む)だけが使えるメソッドで、そのクラスに定義されているinstanceメソッドを返す。falseの場合はそのクラスへの継承メソッドは含まない

No comments: