😀

Juliaでのモジュール拡張 インポート方法での違い

2021/03/22に公開2

はじめに

公式ドキュメントのModuleページを参照しています。

拡張のためのモジュールインポートで大事なこと

モジュールをインポートする方法はusingimportです。

これらの違いは、extendできるかどうかにあります。

extendとは

extendは、そのモジュールをもとにして別のメソッドを付け加えることを言います。

Base.showというBaseのモジュールをもとにする場合、

import Base.show

と書く必要があります。

using Base

と書いた場合は、Base.showとして指定してあげることで、拡張ができるようです。

using Base.show

では拡張できません。

疑問点

公式ドキュメントを読むと

using BigLib: thing1, thing2

は拡張できない書き方です。このthing1、thing2はメソッドと解釈していいのかどうかがわかりません。

using Base: show

と書くとusing Base.showと同義なのでしょうか。

Discussion

antimon2antimon2

用語の(たぶんちょっとだけより正確な)説明。

Julia では Base.show() などは「関数」です。
関数は引数の組合せ(=シグニチャ)ごとに実行される実体が変わります(多重ディスパッチ)が、Julia ではその各実体のことを指して「メソッド」と呼んでいます。
関数の「拡張」というのは、関数に「メソッドを追加」すること、というワケです。

このthing1thing2はメソッドと解釈していいのかどうかがわかりません。

以上の説明から、もしこの thing1 thing2 がそのモジュール内で関数として定義されていれば、それは関数です。名前で参照できるものはあくまで関数です。プログラマはメソッドを意識する必要は通常はありません(しかるべき引数を与えたときに Julia が内部で選択して実行する実体がメソッドなので)。

using Base: show
と書くとusing Base.showと同義なのでしょうか。

同義です。using Xxxx: f, ... は、カンマ区切りで複数並べて指定出来るだけで、1つだけ指定することも別に普通にできてその場合は using Xxxx.f と全く同じ意味になります。import も同じです。

mk83mk83

関数は引数の組合せ(=シグニチャ)ごとに実行される実体が変わります(多重ディスパッチ)

しっくりきました。

また、疑問点についてもお答えいただきありがとうございました。