web-dev-qa-db-ja.com

ジュリア:OOP or not

私はジュリアとジュノに取り組んでいます。

JuliaがOOPをサポートしているかどうかはわかりません。

たとえば、c ++のclassstructのようなものはありますか?

データや関数などのメンバーで宣言する方法は?

37
Yves

疑問がある場合は、ドキュメントを読んでください...

https://docs.julialang.org/en/v1/manual/types/#Composite-Types-1

長い話:

struct MyType
    a::Int64
    b::Float64
end

x = MyType(3, 4)

x.a

編集:メソッドは定義されたoutsideタイプ定義、例えば.

function double(x::MyType)
    x.a *= 2
end

メソッドは、たとえばC++やPythonで行うように、型内でnotを実行します。これにより、Juliaの重要な機能の1つである複数ディスパッチが、システム定義型とまったく同じレベルにあるユーザー定義型でも機能します。

38

Juliaは、メソッドをJuliaのオブジェクト(「型」)にアタッチできないため、完全な意味でオブジェクト指向ではありません。ただし、タイプはオブジェクトと非常によく似ています。ただし、それらには独自のメソッドが関連付けられておらず、継承がないため、オブジェクト自体は動作しません。代わりに、オブジェクトに作用する関数があります。

違いは、ball.checkCollision()とcheckCollision(ball、Walls)です。現実にはそれほど大きな問題ではありません。型に別の型のフィールドを持たせることで、継承のようなものを作成できます。また、複数のディスパッチにより、与えたオブジェクトに基づいて異なることを実行する関数を作成できます。本当の違いは、関数とタイプをファイルに保存する場所です。そのため、Juliaで一種の準オブジェクト指向スタイルを実行できますが、それでもOOP言語とは明らかに異なります。

28

ジュリアユーザーグループ内でのこの価値ある会話について言及したいと思います Julia and Object-Oriented Programming
私にとって、ジュリアは従来のOO言語とは異なり、常にMethod Orientedオブジェクト指向の言語オブジェクト指向言語。これは、を作成しようとするとジュリアのカプセル化されたデータと機能の構造、すぐにあなたはトラブルに巻き込まれます。

11
Reza Afzalan

答えは、ジュリアはc ++ではなくcに近いということです。したがって、OOPは、c ++ :: classではなくc :: structだけを持つJuliaで制限されます。したがって、true OOPオブジェクト、厳密な意味で。

3
geekborj

私は言語の専門家ではありませんが、私の理解は次のとおりです。

クラスと構造体に相当しますが、これらのオブジェクトには単一のコンストラクター以外のメソッドはありません。

C++、Java、Python、Rubyなどの主流のオブジェクト指向言語では、複合型には名前付き関数も関連付けられており、この組み合わせは「オブジェクト」と呼ばれます。 PythonやRubyなどの言語)すべての値は、複合であるかどうかに関係なく、オブジェクトです。C++やJavaを含む、あまり純粋でないオブジェクト指向言語では、整数や浮動小数点などの一部の値値はオブジェクトではありませんが、ユーザー定義の複合型のインスタンスは関連付けられたメソッドを持つ真のオブジェクトです。ジュリアでは、すべての値はオブジェクトですが、関数は操作対象のオブジェクトにバンドルされていません。複数のディスパッチで使用する関数。つまり、メソッドを選択するときに、最初の引数だけではなく、関数のすべての引数の型が考慮されます(メソッドとディスパッチの詳細については、メソッドを参照してください)。 「属する」機能最初の引数のみ。メソッドの名前付きバッグを各オブジェクトの「内部」に置くのではなく、メソッドを関数オブジェクトに編成することは、言語設計の非常に有益な側面になります。

2
Tim B

はい。フィールドを持つ具体的な「クラス」からは継承できず、抽象クラスからのみ継承できます。これは、ジュリアの具体的な構造体のメモリレイアウトがそのインターフェイスの一部であり、フィールドを追加してサブクラス化できると、リスコフ置換の原則が破られるためです。

ただし、複数のディスパッチを持つ関数は、単一のディスパッチを持つメソッドの厳密な一般化であり、厳密に多態的です。それらは複数のオブジェクトに「属する」ことができるため、クラス定義の外側で定義する必要があります。

OO言語の従来のメソッドは、最初の引数に基づいてのみディスパッチするJulia関数の特殊なケースです。

2
saolof