• ベストアンサー

Ruby 同じ名前のメソッド

始めましてよろしくお願いします。 さっそくなんですが Rubyで class A def dash( a, b ) end def dash( a ) end end というような使い方をしたいのですが どのように書けばいいのでしょうか? ちなみにこの書き方だと、後に書いた dash( a ) の方だけが有効になりました。

質問者が選んだベストアンサー

  • ベストアンサー
  • you-m
  • ベストアンサー率58% (190/327)
回答No.4

一応情報を追加しておくと、公式仕様にはありませんが、オーバーロードを実現するライブラリを書いた人はいます。 個人サイトのようなので、ちょっとURLは掲載できませんが、「ruby オーバーロード ライブラリ」等で検索すると、見つかると思います。 まあ、使うかどうかは微妙なところかと思いますが、参考までに。

maruchan0488
質問者

お礼

回答有難うございます。 さすがRubyですね そんなライブラリを作っている人がいるとは。。。 さっそく探してみます。

その他の回答 (6)

  • you-m
  • ベストアンサー率58% (190/327)
回答No.7

余談になりますが・・・ 型の有無にこだわっていると、本質を見失います。 おそらく、型指向の言語での構造化プログラミングに慣れているかただと思いますが、もう少しオブジェクト指向自体について勉強された方がいいと思います。 目先の方法論よりも、プログラム自体の設計についての考え方を根本から変えることで、同じ結果を導き出すまったく別のプログラムが書けることに気が付くと思います。 例題だけだと、用途がよくわかりませんが、たとえばこの場合だと、dashメソッド以外共通の要素をもったクラスXを 継承して、AとA´を定義し、後はファクトリーメソッドのデザインパターンに当てはめる方が、よりオブジェクト指向チックに解決できるような気がします。 というより、そのようなコードにしないと本当にRubyの良いところが見えてきません。 参考までに。

maruchan0488
質問者

お礼

アドバイスありがとうございます。 非常に核心を突いた言葉で米神が痛いです。。。 買ってそのままになっているデザインパターンの本を 読み直してみようと思います。

  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.6

#5 です。 肝心な引数を渡すのを忘れていました。 訂正したものを投稿します。 #!ruby -Ks class TEST private  def method0()   puts "引数なし用のメソッド呼び出し"  end  def method1( arg )   puts "引数1個: '#{arg}'"  end  def method2( arg1, arg2 )   puts "引数2個: '#{arg1}', '#{arg2}'"  end public  def pubMethod( *arg )   case arg.size   when 0    method0()   when 1    method1( arg[0] )   when 2    method2( arg[0], arg[1] )   else    puts "例外処理する?"   end  end # end def end # end class obj = TEST.new obj.pubMethod() obj.pubMethod("foo") obj.pubMethod("foo", 10) obj.pubMethod("foo", 10, "bar")

maruchan0488
質問者

お礼

回答ありがとうございます。 サンプルコードまで書いて頂いて 恐縮です。。。 引数の個数だけで呼び出しを判断するんだったら このやり方で充分だと思うので 今回は、Bo_Boさんのやり方でやろうと思います。 余談 Ruby系の言語をやる前は、型を意識しないで プログラムが書けるのか~ っと感心していましたが いざブログラムを書いてみると 型がないことによる 不便さだけが目立ちますorz もう少し触れていけば考えが変わる事を願います。

  • Bo_Bo
  • ベストアンサー率65% (97/149)
回答No.5

> 知りたい事は、同じメソッド名を定義して > 引数の数でどちらかのメソッドを読んでくれるか という事です。 の発言に反応します。 下記の動作イメージはどうですか? ●引数の個数判定で分岐して、対応するプライベート・メソッドを呼ぶ 【注意】  インデントのために全角の空白を使用!  実作業へは、半角空白2個に置き換えてください。 ---- 以下ソース ---- #!ruby class TEST private  def method0()   puts "引数なし用のメソッド呼び出し"  end  def method1()   puts "引数1個用のメソッド呼び出し"  end  def method2()   puts "引数2個用のメソッド呼び出し"  end public  def pubMethod( *arg )   case arg.size   when 0    method0()   when 1    method1()   when 2    method2()   else    puts "例外処理する?"   end  end # end def end # end class obj = TEST.new obj.pubMethod() obj.pubMethod("foo") obj.pubMethod("foo", 10) obj.pubMethod("foo", 10, "bar")

  • you-m
  • ベストアンサー率58% (190/327)
回答No.3

単純に書かれた要件だけを満たすのであれば、bを省略可能な引数として、内部で2種類の処理を分岐によって書くのがひとつの方法です。 しかし、オブジェクト指向っぽくないので、スマートではないですね。 しかし、参考URLを見てもらうとわかると思うのですが、言語仕様的に一般的に言うオーバーロードができません。 Rubyの作者の発言なので、間違いないでしょう。 やり方によっては、逃げ道は無いわけじゃないというところですね。

参考URL:
http://www.ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-list/1401
maruchan0488
質問者

お礼

回答ありがとうございます。 まさに知りたい事はその事でした。 同時に普通のやり方では、実現できない事もわかりました。 う~ん ちょっと残念・・・

  • JeanneNet
  • ベストアンサー率48% (100/208)
回答No.2

あ、間違えた... orz

maruchan0488
質問者

補足

すいません 私の説明が足りませんでした。 知りたい事は、同じメソッド名を定義して 引数の数でどちらかのメソッドを読んでくれるか という事です。 型がある言語の場合、引数の数が一緒でも型が違うと 違うメソッドとして認識してくれますよね? Rubyでは、型がないので せめて引数の数で メソッド呼び出しを分けてくれないかな っと思って質問しました。

  • JeanneNet
  • ベストアンサー率48% (100/208)
回答No.1