Julia 1.0における、usingとimportの違いについてまとめてみた。
https://docs.julialang.org/en/v1.0/manual/modules/
を参考にした。
テストモジュール
まず、テストモジュールとして、
module Mymodule1 #エクスポートするfunctionはなし
function test()
println("Mymodule1: test")
end
function test2()
println("Mymodule1: test2")
end
end
module Mymodule2
export test #test()だけをexportしておく
function test()
println("Mymodule2: test")
end
function test2()
println("Mymodule2: test2")
end
end
の二つを用意する。
using
まず、usingを試してみる。
using .Mymodule1
をやってみる。.Mymodule1の先頭のドット.は自前のモジュールの場所を表す。
using .Mymodule1
test()
はtestがないと怒られる。
using .Mymodule1
Mymodule1.test()
は表示される。したがって、usingを使うときには、モジュール名.が必要そうだ。
一方、
using .Mymodule2
test()
は動く。これは、Mymodule2において、exportがつけられているからである。もちろん、
using .Mymodule2
test2()
は怒られる。なぜなら、test2はexportされていないからである。
また、
using .Mymodule2: test2
test2()
であれば、test2を呼ぶことができる。これは、:を使ったことにより、exportを書いたことと同等の効果が得られたと考えられる。
よって、省略して呼べるのは、
- exportに書いたfunction
- using モジュール名:function名 と書いたfunction
ということがわかる。
import
次はimportについて。
import .Mymodule1
test()
は怒られる。
import .Mymodule1
Mymodule1.test()
としなければならない。
他には、
import .Mymodule1.test,.Mymodule1.test2
test()
test2()
があるが、この場合はMymodule1を省略して呼べる。
import .Mymodule1:test,test2
test()
test2()
でも、Mymodule1を省略して呼べる。
では、Mymodule2についてはどうだろうか?
import .Mymodule2
test()
は怒られる。exportに書いてあっても関係がないようだ。
import .Mymodule2.test2
test2()
は呼べる。
よって、省略して呼べるのは、
- import モジュール名.function名
- import モジュール名:function名
の二つである。
#usingとimportの違い
usingを使うと、exportに入っているものはすべてモジュール名なしで(省略して)呼ぶことができる。しかし、たくさんexportにfunctionがある場合、using モジュール名を使うと、使う予定のないものまで省略して呼べてしまうので、面倒なことになることもある。
一方、importの場合、exportの有無の関係なしに、デフォルトではモジュール名をつけなければならない。しかし、import モジュール名.function名あるいは import モジュール名:function名とすれば、そのfunctionだけモジュール名を省略して呼ぶことができる。汎用的なライブラリを呼ぶときは、importで必要なものだけ呼べば、不必要に名前を使われることはない。