トップ «前の日記(2007-11-02) 最新 次の日記(2007-11-10)» 編集

Ussy Diary


2007-11-07

[Ruby]アクセス制御

ちょこちょことサンプルコードを書いていたら、 private なクラス メソッドが Ruby では外部から呼び出しができてしまいました。

こんなコード。

access.rb

class Hoge
   private
   def self.hello
      "Hello."
   end

   def huga
      "Huga."
   end
end

puts Hoge.hello
puts Hoge.new.huga

実行

Hello.
access.rb:13: private method `huga' called for #<Hoge:0xb7c74964> (NoMethodError)

よく分からなかったので、先日購入したプログラミング Ruby を見てみました。

private は明示的なレシーバを指定して呼び出せず、 レシーバは常に自分自身 (self) です。

レシーバとは . (ピリオド)の前の部分とのこと。

Java と C# で書いてきたので違和感を感じてしまうなあ。 たくさん書いてはやく違和感をなくしたいと思います。

[追記:] private_class_method :hello と指定することでクラスメソッドを private にすることができました。