juliaのimportとusingの違いについて
juliaを初めて触った頃に、importとusingの違いがわからずモヤモヤしていた時期が続いたので、備忘録として違いについてまとめる。
以下のコードを例にする。
module MyPkg
export greet
export another
greet() = println("greet with no args")
another() = println("これは邪魔者です")
end
実行
#ドット.は自前のモジュールの場所を表す。
using .MyPkg # greet, another が見える
# これは、exportをつけているからである。
using .MyPkg:greet # greet は見える, another は見えない
using .MyPkg:MyPkg # MyPkg.greet でアクセスできる
import .MyPkg # using .MyPkg:MyPkg とほぼ同じ
usingを使えば、exportしている関数はusing .MyPkg
をするだけで呼び出すことができる。例えば、以下のような感じである。
julia> using .MyPkg
julia> greet()
greet with no args
一方、import .MyPkg
は、exportの有無関係なく、MyPkg.function()
がなければいけない。
julia> import .MyPkg
julia> greet()
ERROR: UndefVarError: greet not defined
Stacktrace:
[1] top-level scope
@ REPL[3]:1
julia> MyPkg.greet()
greet with no args
特定の関数を呼び出したければ、import/using .MyPkg:function
とする。
using .MyPkg:greet # greet は見える, another は見えない
とりあえずパッケージで遊んでみたいときは、usingを使えば良さそうである。そうすればexportしている関数は、function()だけで使うことができる。
usingを使う時に注意点として、どんな名前の関数が呼び出されているかわからないので、自分のパッケージで定義された関数と名前が衝突してしまうことである。
従って、その問題を回避するためには、import
を使うのが無難だろう。
参考
こちらの記事も一緒に読むと理解が深まりました。
https://qiita.com/cometscome_phys/items/5c98aef4c10a8a575f81