ダック・タイピング Rubyでの例

ダック・タイピング

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/17 16:02 UTC 版)

Rubyでの例

Rubyでの単純な例を示す。

def test(foo)
  puts foo.sound
end

class Duck
  def sound
    'quack'
  end
end

class Cat
  def sound
    'myaa'
  end
end

test(Duck.new)
test(Cat.new)

出力は以下である。

quack
myaa

2つのクラスに継承の関係が無いことに注目して欲しい。上記のtestメソッドは、soundという名前のメンバーを持つオブジェクトであれば何でも受け付ける。なお、Rubyのputsは引数オブジェクトを自動的に文字列に変換して標準出力に出力する[12]ため、仮に文字列以外を返すsoundであっても受け付ける。このような柔軟性が動的言語の特徴である。

C++での例

上記Rubyの例をC++で記述すると、以下のようになる。

#include <iostream>

template <class T>
void test(const T& t) {
  std::cout << t.sound() << std::endl;
}

struct Duck {
  const char* sound() const {
    return "quack";
  }
};

struct Cat {
  const char* sound() const {
    return "myaa";
  }
};

int main() {
  test(Duck());
  test(Cat());
}

実行結果はRubyの例と同じである。ただし、テンプレートによるダック・タイピングはコンパイル時に解決される静的なポリモーフィズム (static polymorphism) であり、動的型付け言語とは異なり実行時のオーバーヘッドを伴わない。

C#での例

C#はバージョン4.0で動的型付けを可能にするdynamic型が使えるようになった。dynamicは内部的にはリフレクションを利用して実装されており、該当するメソッドやプロパティの存在有無を実行時に遅延評価する。シンボル解決に失敗した場合は例外がスローされる[13]

using System;

class Duck {
    public string Sound() {
        return "quack";
    }
}

class Cat {
    public string Sound() {
        return "myaa";
    }
}

public class DuckTypingTest {
    static void Test(dynamic obj) {
        Console.WriteLine(obj.Sound());
    }

    public static void Main() {
        Test(new Duck());
        Test(new Cat());
    }
}

なお、C#はC++のテンプレートに似た機能としてジェネリクスをサポートするが、C++テンプレートほどの柔軟性はなく、ダック・タイピングに使用することはできない[14]


注釈

  1. ^ nominalは名目的または記名的とも訳される。

出典

  1. ^ Python Duck Typing - Example” (英語). Techie Hours (2020年6月28日). 2020年7月26日閲覧。
  2. ^ a b Python Software Foundation. “Glossary — Python 3.7.1 documentation, §duck-typing”. docs.python.org. 2018年11月8日閲覧。
  3. ^ Dynamic typing vs. static typing | Oracle
  4. ^ Benjamin C. Pierce「第15章 部分型付け」『型システム入門 −プログラミング言語と型の理論−』オーム社、2013年3月26日。ISBN 978-4274069116
  5. ^ Objects and Aspects: Row Polymorphism | Neel Krishnaswami, Department of Computer Science, Carnegie Mellon University
  6. ^ 実例によるPureScript
  7. ^ OCamlで構築するモダンWeb:型付きHTML5プログラミングの実際 | 有限会社ITプランニング | 今井 敬吾
  8. ^ Benjamin C. Pierce「19.3 名前的型システムと構造的型システム」『型システム入門 −プログラミング言語と型の理論−』オーム社、2013年3月26日。ISBN 978-4274069116
  9. ^ typingは「型付け」と訳されることが多いが、subclassingは「サブクラス化」と訳されることが多い。subtypingは「部分型付け」や「サブタイプ化」としてもよいかもしれないが、本記事ではduck typingを「ダック・タイピング」とカナ表記しているのでそれに準じることにする。
  10. ^ TypeScript: Documentation - Type Compatibility
  11. ^ Python Software Foundation. “Glossary — Python 3.10.1 documentation, §abstract base class”. docs.python.org. 2021年12月19日閲覧。
  12. ^ Kernel.#puts (Ruby 3.0.0 リファレンスマニュアル)
  13. ^ dynamic 型の使用 - C# プログラミング ガイド | Microsoft Docs
  14. ^ Differences Between C++ Templates and C# Generics - C# Programming Guide | Microsoft Docs
  15. ^ Object Variable Declaration - Visual Basic | Microsoft Docs
  16. ^ Early and Late Binding - Visual Basic | Microsoft Docs
  17. ^ Java Core Reflection
  18. ^ IDispatch Interface and Accessibility - Windows applications | Microsoft Docs
  19. ^ IDispatchEx Interface | Microsoft Docs






固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「ダック・タイピング」の関連用語

ダック・タイピングのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ダック・タイピングのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのダック・タイピング (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS