From: 横山(KOJIMA) <yokotatu / kojima.net>
Subject: [ruby-list:45073] メソッドのパラメータについて
Date: Mon, 16 Jun 2008 20:53:41 +0900

> 横山と申します。
> 出力パラメータをもつメソッドをつくることはできないのでしょうか。

できないことはないけど、ほとんどやる意味がないと思います。

> 例えば、
> def sub(p1,p2)
> end
> というメソッドがあり、
> sub(data1,dat2)としたとき、
> 結果として
> data1に何らかの数値(又は文字列)が格納されることを期待しています。
> data2についても同様です。

こんなのでしょうか?

def sub(p1, p2)
  p1.replace "foo"     # 文字列p1を "foo" に置き換える
  p2 << "bar"          # p2に "bar" を追記する
end

data1 = ""
data2 = "hoge"
sub(data1, data2)
data1                           # => "foo"
data2                           # => "hogebar"

予め初期値を渡しておいて、sub内で破壊的メソッドで書き換えることはできます。
数値には破壊的メソッドがないので無理です。


もしかして、オブジェクトに追記するメソッドが実現できるかどうかでしょうか?
たとえば「<<」メソッドはStringもArrayもIOも受け付けるのでこんなことができます。
これぞduck typing。

def output(out)
  out << "added\n"
end

s = ""                          # 文字列でも
output s
s                               # => "added\n"
a = []                          # 配列でも
output a
a                               # => ["added\n"]
output $stdout                  # IOでも
# >> added


> このとき、p1,p2は出力用なので、subを呼び出すときに、data1,data2に値を設定し

こんな場合に多値を使いましょう。
メソッドが配列を返すと、それを多重代入で受けることができます。

def sub
  ["output1", 2]
end
data1, data2 = sub
data1                           # => "output1"
data2                           # => 2

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/