requireと importの違いが分かりません。教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
Elixirのrequire
とimport
には以下の機能があります。
require
:指定したモジュールで定義されたマクロを使えるようにするためのものimport
:指定したモジュールで定義された関数とマクロを、モジュール名抜きで使えるようにするためのもの
Elixirのマクロはrequire
で明示的にオプトインしないと使えません。一方、publicな関数(def
で定義した関数)は、モジュール名.サブモジュール名.関数名()
のように完全修飾名(fully-qualified name)で指定すれば使えます。require
によるオプトインは必要ありません。
iex
1$ iex 2# マクロは使用に先立ってrequireが必要。requireしないとエラーになる 3iex> Integer.is_odd(3) 4** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1 5 (elixir) src/elixir_dispatch.erl:97: :elixir_dispatch.dispatch_require/6 6 7# requireすれば使えるようになる。 8iex> require Integer 9Integer 10iex> Integer.is_odd(3) 11true 12 13# 関数はrequireなしで使える 14iex> List.flatten [1, [2, 3], 4] 15[1, 2, 3, 4]
import
を使うと関数やマクロを関数名()
のようにモジュール名やサブモジュール名抜きの省略形で使えるようになります。
elixir
1iex> import Integer, only: [ is_odd: 1 ] 2Integer 3iex> is_odd(3) 4true 5iex> import List, only: [ flatten: 1 ] 6List 7iex> flatten [1, [2, 3], 4] 8[1, 2, 3, 4]
なおマクロをimport
するとモジュールを自動的にrequire
してくれますので、require
は省略できます。
# iexを立ち上げ直す $ iex # この状態ではマクロは使えない iex> Integer.is_odd(3) ** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1 (elixir) src/elixir_dispatch.erl:97: :elixir_dispatch.dispatch_require/6 # importすると自動的にrequireしてくれるので、別途requireを書かなくてよい iex> import Integer, only: [ is_odd: 1 ] Integer iex> is_odd(3) true
投稿2019/12/22 08:15
総合スコア2046
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。