9

NamedArraysおよびImagesで定義されているものと同様の型を作成することを検討しています。基本的に、メタデータの一部を含む配列が必要だとしましょう。たとえば、配列をディスクに書き込むときに、ファイルの先頭に書き込むわかりやすい名前を付けます。(この詳細は関係ありません。例を考えているだけです。)

だから私はするかもしれません

type MyNamedArray
    data::Array
    name::ASCIIString
end

function mywrite(f,x::MyNamedArray)
     write(f,x.name)
     write(f,x.data)
end

または何か、他の動作は基本配列動作と異なる必要はありません。

私の頭の中では、配列を操作するすべての既存の関数dataがこの型のフィールドを操作することを望んでいるのは「明らか」です。Java などの別の言語では、Array をサブクラス化nameし、インスタンス フィールドとしてサブクラスに追加しただけで、既存のすべての Array 操作との互換性が自動的に維持されます。しかし、Julia で上記のような解決策を試してみると、リンクされたパッケージで @TimHoly と 'davidavdav' が行ったように、さらに多くの関数を定義する必要があります。

もちろん、これらの関数のいくつかを手で書き出すことを余儀なくされることは、考えもしなかったことを実現するのに役立つことは承知しています。たとえば、MyNamedArray上記の例では、 の名前を定義していないことを指摘して異議を唱えることができますx::MyNamedArray * y::MyNamedArray。しかし、それを気にせず、ボイラープレートをあまり使わずに「ただ動く」コードが必要な場合はどうすればよいでしょうか。(たとえば、シンボルをループして NamedArraysに新しいメソッド定義をプッシュし、 Imagesに 100 行の定義を手動で書き出すことを参照してください。これらの定義の大部分はボイラープレート/「明白な」定義です。)

具体的には、私が引用した例を続けるとMyNamedArray、デフォルトは でx*yはなくなりますMyNamedArray。つまり、すべての関数は、基礎となるデータに同じ関数を適用するという「継承された」動作にデフォルト設定されるだけなので、すべての pre のメタデータを忘れることができます。 -既存の機能。

注意してください、Tomas Lycken の回答here は洞察に満ちていると思います。また、質問と回答hereも同様です。

私が思いつく最良の統合は、「それを吸い上げて関数を書き出すか、それを行うマクロを書くだけでよい」というものです。もしそうなら、そうです。より良いオプション、特にソリューションを設計してよりジュリアンにし、ボイラープレートを回避するためのより良い方法がないかどうか疑問に思っています。

4

1 に答える 1