😀
Juliaでのモジュール拡張 インポート方法での違い
はじめに
公式ドキュメントのModuleページを参照しています。
拡張のためのモジュールインポートで大事なこと
モジュールをインポートする方法はusing
とimport
です。
これらの違いは、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
用語の(たぶんちょっとだけより正確な)説明。
Julia では
Base.show()
などは「関数」です。関数は引数の組合せ(=シグニチャ)ごとに実行される実体が変わります(多重ディスパッチ)が、Julia ではその各実体のことを指して「メソッド」と呼んでいます。
関数の「拡張」というのは、関数に「メソッドを追加」すること、というワケです。
以上の説明から、もしこの
thing1
thing2
がそのモジュール内で関数として定義されていれば、それは関数です。名前で参照できるものはあくまで関数です。プログラマはメソッドを意識する必要は通常はありません(しかるべき引数を与えたときに Julia が内部で選択して実行する実体がメソッドなので)。同義です。
using Xxxx: f, ...
は、カンマ区切りで複数並べて指定出来るだけで、1つだけ指定することも別に普通にできてその場合はusing Xxxx.f
と全く同じ意味になります。import
も同じです。しっくりきました。
また、疑問点についてもお答えいただきありがとうございました。