[ruby-list:41812] "module private"な変数・メソッド

From: KURODA Hiraku <hiraku@...>
Date: 2006-02-04 04:17:25 UTC
List: ruby-list #41812
こんにちは、黒田です。

現在Rubyでは、モジュールの中で定義されたメソッドは、そのモジュールを
includeしたクラスからは無制限に呼び出せます(よね?(汗
これを、同じモジュールで定義されたメソッドからしか呼べないように制限する
手法って何かないでしょうか?

例えば、オブジェクトを何らかの条件に応じた形式でファイルに保存する為のモ
ジュールを、以下のように作るとします。

module Dumper
   def dump
      open("file", "w") do |f|
         # @f = f としたい
         case hoge # オブジェクトの条件で場合分け
         when fuga1 # 形式1で保存
            private1(f)
            #private1 とパラメータなしで呼びたい
         when fuga2 # 形式2で保存
            private2(f)
            #private2 とパラメータなしで呼びたい
         end
      end
   end

   def private1(f)
      fに形式1で保存
      #@f を使って保存したい
   end

   def private2(f)
      fに形式2で保存
      #@f を使って保存したい
   end
end

このモジュールを適当なクラスでincludeすると、private1, private2も
(include元のクラスから呼べる必要がないのに)呼べてしまいます。

このような"モジュールの中だけで使えれば良いメソッド"を、include元のクラ
スから隠す方法って何か確立されてないでしょうか?

またこの話のインスタンス変数版のような話なのですが、例えば先の例では、変
数 f をメソッドのパラメータとして渡しています。
これを、モジュールの中からしか見えないインスタンス変数のようなものに代入
して、別のメソッドから参照する方法はないでしょうか?

実際に @f 等とした変数に f を代入してしまうと、呼び出し元クラスで @f を
使ってたら動作がおかしくなるのではないかという懸念があって、モジュール内
では@変数を(モジュール内だけで使いたい変数としては)使えずにいます。

以上、よろしくお願いします。

-- 
--------------------------------------------------
 黒田 拓(くろだ ひらく)
    hiraku@hinet.mydns.jp
    http://www.hinet.mydns.jp/~hiraku/
--------------------------------------------------


In This Thread

Prev Next