オーバーロードは書けるの?

INDEX PAGE


オーバーロードは書けるの?



Javaでは同じ名称のメソッドで引数の型、個数などを変えられる
いわゆるオーバーロードというテクニックが存在します。


Rubyに関しては、オーバーロードという記述方法は存在していないようです。
そもそもスクリプト言語ということもあり
引数に関する型判定が存在していないということが一番大きな理由と思われます。


しかし、実際問題としてオーバーロードを使えないと
プログラムとして使いにくいということも多いはずです。
Rubyではオーバーロードこそできませんが、同じようなことをする方法はいくつか提供されています。


■引数にデフォルト値を設定する

下記のように、引数に対して「=」をつなげて値を設定することでデフォルト値を設定することができます。
デフォルト値が設定できれば引数自体は省略可能になります。

def hoge(key1,key2,key3=nil,key4=nil)
 print(key1)
 print(key2)

 unless key3 ==nil then
  print(key3)
 end

 unless key4 ==nil then
  print(key4)
 end
end

勿論、実際に引数が渡されてくればそちらがデフォルト値よりも優先されます。

http://www.rubylife.jp/ini/method/index3.html

引数の順番の意味が固定になることは避けられないのですが、
個人的には、これで大方の要件は満たせました。



■引数をハッシュや配列で渡す

引数で受け取ったハッシュや配列を、メソッドのロジックの中でばらして
使用するという方法もあります。

配列を渡す方法として

def hoge(*keys)
 
end

というように「*」を利用することもできるようです。
http://www.ruby-lang.org/ja/man/html/FAQ_CAD1BFF4A1A2C4EABFF4A1A2B0FABFF4.html#a2.2e8.20.2a.a4.ac.a4.c4.a4.a4.a4.bf.b0.fa.bf.f4.a4.cf.b2.bf.a4.c7.a4.b9.a4.ab

どちらにしても、引数に対するチェックをしっかりしないと
若干恐いかもしれないなぁと感じます。



■引数の型を判定してCase文で書く

とてもべたな方法ですが、引数の型によって処理を変えたいならこの方法です。

def hogePrint(hoge)
 
 case hoge
  when hoge.class.to_s = "String" then
   print hoge
when hoge.class.to_s = "Integer" then
print hoge.to_s
  else
   print "hoge is't String or Numeric"
 end
 
end

相当ださいのであまり使いたくないですが、一応。
なお、型のチェックについては下に書いておきました。

型(Class)のチェック



INDEX PAGE