Rubyには「ダック・タイピング」が可能とのことを知りました。
しかしその有用性がわかりません。
ダック・タイピングのメリットを教えてください。
Wikipediaには以下のように書いてありました。
ダック・タイピング - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83% …
「オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、たとえそのクラスがそのインタフェースを宣言的に実装していなくとも、オブジェクトはそのインタフェースを実行時に実装しているとみなせる」
とりあえず意味はわかりました。しかし、すべてのメソッドを実装する努力をしながらインターフェイスの宣言をしないメリットがわかりません。そのインターフェイスを使うことがわかっているのなら宣言すればいい話だと思いますし、宣言を記述しなくて済むというメリットしかないということもないと思います。
ダック・タイピングのメリットを教えてください。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> ダック・タイピングのメリットを教えてください。
メリットはリンク先に書かれている
「オブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する」ではないでしょうか。
リンク先のRubyスクリプト例で言えば、testの引数に与えられるオブジェクトにsoundというメソッドが在りさえすれば、それに応じた戻り値を返すということです。
> 「オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、(以下略)」
については以下のようなスクリプトでは如何ですか
def test(foo)
puts foo.sound
end
class Duck
def sound
'quack'
end
end
class Cat
def sound
'myaa'
end
end
dog = String.new("pochi")
def dog.sound
'bow'
end
test(Duck.new) # => quack
test(Cat.new) # => myaa
test(dog) # => bow
Stringというクラスは、soundというメソッドを実装していませんけれども、dogというオブジェクトはsoundメソッドを持っているので"bow"という値を返します。
反応非常に遅くて失礼しました。
いまさらながらになんとなくわかりました。
この部分は、
def test(foo)
puts foo.sound
end
引数で渡されるfooはsoundというメソッドを持っているかどうかは
保証されないということですね?(Javaばっかりの人なので意味がわかりませんでした)
仮にfooにsoundがなかった場合には
Javaだったらコンパイル時にエラーになる、実行前に保証されている、
Rubyだったら実行時にエラーになる、実行するまでわからない。
でも、1つのインターフェイスでメソッドの有無を保証しなくとも
実装者がきちんと書いてくれれば、インターフェイスを限定しなくとも
いいじゃん。そのほうが柔軟で便利でしょということですね。タブン。
なんというか理念の違いのようなものなのでしょうかね。
Rubyはまったくわからないために時間がかかりましたがようやくわかりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビーリアルのユーザー名を変え...
-
プログラミング初学者の勉強方法
-
MacBookAir起動時にRubyソース...
-
再起動後必ず2つのエラーが出...
-
A4 持ち込み
-
前回の質問の続き
-
あせんうぶり言語
-
これらは書誌情報だと思うので...
-
情報の表現。()内がどうしても...
-
pythonのerrorコード
-
三項でたとえば交換って
-
WinSCPで画像のように puttyを...
-
パソコンのスクリーンセーバー...
-
こういう問題分をよんだとき
-
バーチャルボックスが使えなく...
-
なんで if __name__ == "__main__"
-
GitHubは初年度以外は有料にな...
-
ぱいソン
-
クリスタルレポートで困ってい...
-
パイソンのクラスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ブロック1 Ruby認定試験対策問題
-
インスタンス変数の値の保持に...
-
Ruby バブルソート
-
ダック・タイピングのメリット
-
railsでアプリケーションコント...
-
リダイレクトでPOSTリクエスト...
-
CloseとQuitについて
-
timesの使いどころ
-
railsチュートリアル5章の演習
-
「arg」は何の略?
-
What class are you in? には何...
-
教えてください。vb5.0
-
Csvファイルの最終行を取得する...
-
get() と find() の違いについて
-
エラー「メソッドまたはデータ...
-
class roomとclassroom どちら...
-
関数の引数に複数のユーザ定義...
-
実行時エラー450:引数の数が一...
-
クラス名やモジュール名の競合...
-
VBA/GetTickCountの49.7日の境...
おすすめ情報