C++のノリで以下のように宣言しても、Rubyのクラスメソッドはprivateにはなりません。

   1  class Foo
   2  private
   3    def self.bar
   4    end
   5  end
   6  
   7  Foo.bar #=> 呼べる

Rubyでクラスメソッドをprivateにするためには、以下のように private_class_methodを利用します。

   1  class Foo
   2    def self.bar
   3    end
   4  
   5    private_class_method :bar
   6  end
   7  
   8  Foo.bar # => NoMethodError: private method `bar' called for Foo:Class

private_class_methodの宣言は、メソッド定義より後ろにある必要があります。

posted by Png genki on Mon 5 May 2008 at 04:44 with 2 comments

Comments:

Face lukesilvia over 12 years ago.

privateもクラスレベルで行わないとだめです class Hoge class << self private def hoge 1 end end end

Png 瀧内元気 over 12 years ago.

ご指摘の通りです。

   1  class Hoge
   2    class << self
   3    private
   4      def hoge
   5        1
   6      end
   7    end
   8  end

ということですね。 private_class_methodは、結果的には上記と同様のことをしてくれる感じになります。 Cレベルのソースは以下のような感じですね。

   1  static VALUE
   2  rb_mod_private_method(argc, argv, obj)
   3      int argc;
   4      VALUE *argv;
   5      VALUE obj;
   6  {
   7      set_method_visibility(CLASS_OF(obj), argc, argv, NOEX_PRIVATE);
   8      return obj;
   9  }

既存のメソッドの可視性をprivateにしています。

or Preview
Social Bookmarks
  • Delicious
  • B_entry561
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ