こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Ruby 同じ名前のメソッド

始めましてよろしくお願いします。

さっそくなんですが Rubyで
class A
def dash( a, b )
end

def dash( a )
end
end

というような使い方をしたいのですが
どのように書けばいいのでしょうか?

ちなみにこの書き方だと、後に書いた
dash( a ) の方だけが有効になりました。

投稿日時 - 2005-05-24 17:49:44

QNo.1407279

暇なときに回答ください

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

一応情報を追加しておくと、公式仕様にはありませんが、オーバーロードを実現するライブラリを書いた人はいます。

個人サイトのようなので、ちょっとURLは掲載できませんが、「ruby オーバーロード ライブラリ」等で検索すると、見つかると思います。

まあ、使うかどうかは微妙なところかと思いますが、参考までに。

投稿日時 - 2005-05-24 19:56:36

お礼

回答有難うございます。

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

投稿日時 - 2005-05-24 21:01:42

ANo.4

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

余談になりますが・・・

型の有無にこだわっていると、本質を見失います。
おそらく、型指向の言語での構造化プログラミングに慣れているかただと思いますが、もう少しオブジェクト指向自体について勉強された方がいいと思います。

目先の方法論よりも、プログラム自体の設計についての考え方を根本から変えることで、同じ結果を導き出すまったく別のプログラムが書けることに気が付くと思います。

例題だけだと、用途がよくわかりませんが、たとえばこの場合だと、dashメソッド以外共通の要素をもったクラスXを
継承して、AとA´を定義し、後はファクトリーメソッドのデザインパターンに当てはめる方が、よりオブジェクト指向チックに解決できるような気がします。
というより、そのようなコードにしないと本当にRubyの良いところが見えてきません。

参考までに。

投稿日時 - 2005-05-24 22:15:20

お礼

アドバイスありがとうございます。

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

投稿日時 - 2005-05-24 23:51:55

ANo.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")

投稿日時 - 2005-05-24 20:31:29

お礼

回答ありがとうございます。

サンプルコードまで書いて頂いて 恐縮です。。。

引数の個数だけで呼び出しを判断するんだったら
このやり方で充分だと思うので
今回は、Bo_Boさんのやり方でやろうと思います。

余談
Ruby系の言語をやる前は、型を意識しないで
プログラムが書けるのか~ っと感心していましたが
いざブログラムを書いてみると
型がないことによる 不便さだけが目立ちますorz
もう少し触れていけば考えが変わる事を願います。

投稿日時 - 2005-05-24 21:10:40

ANo.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")

投稿日時 - 2005-05-24 20:02:53

ANo.3

単純に書かれた要件だけを満たすのであれば、bを省略可能な引数として、内部で2種類の処理を分岐によって書くのがひとつの方法です。
しかし、オブジェクト指向っぽくないので、スマートではないですね。

しかし、参考URLを見てもらうとわかると思うのですが、言語仕様的に一般的に言うオーバーロードができません。
Rubyの作者の発言なので、間違いないでしょう。

やり方によっては、逃げ道は無いわけじゃないというところですね。

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

投稿日時 - 2005-05-24 18:59:49

お礼

回答ありがとうございます。

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

投稿日時 - 2005-05-24 19:29:25

ANo.2

あ、間違えた... orz

投稿日時 - 2005-05-24 18:14:50

補足

すいません 私の説明が足りませんでした。

知りたい事は、同じメソッド名を定義して
引数の数でどちらかのメソッドを読んでくれるか という事です。

型がある言語の場合、引数の数が一緒でも型が違うと
違うメソッドとして認識してくれますよね?
Rubyでは、型がないので せめて引数の数で
メソッド呼び出しを分けてくれないかな っと思って質問しました。

投稿日時 - 2005-05-24 19:20:13

ANo.1

こんにちは、じゃんぬねっと です。

Google 検索結果
http://www.google.co.jp/search?hl=ja&q=Ruby+%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AD%E3%83%BC%E3%83%89&lr=

投稿日時 - 2005-05-24 18:13:16