Python / Java / Golang dillerinden gelen geçmişle, importvs usede benim için karıştırıldı. Bu, kodun yeniden kullanım mekanizmasını bazı bildirimsel dil örnekleriyle açıklayacaktır.
ithalat
Kısacası Elixir'de modülleri içe aktarmanıza gerek yok. Tüm genel işlevlere tam nitelikli MODULE.FUNCTION sözdizimi ile erişilebilir:
iex()> Integer.mod(5, 2)
1
iex()> String.trim(" Hello Elixir ")
"Hello Elixir"
Python / Java / Golang'da, bu MODÜL'deki import MODULEişlevleri kullanmadan önce yapmanız gerekir , örneğin Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
O zaman importElixir'in yaptığı şey sizi şaşırtabilir:
Tam nitelikli adı kullanmadan diğer modüllerden işlevlere veya makrolara kolayca erişmek istediğimizde içe aktarmayı kullanırız.
https://elixir-lang.org/getting-started/alias-require-and-import.html#import
Yani yazmak istiyorsanız sqrtyerine Integer.sqrt, trimyerine String.trim, importirade yardım
iex()> import Integer
Integer
iex()> sqrt(100)
10.0
iex()> import String
String
iex()> trim(" Hello Elixir ")
"Hello Elixir"
Bu, kod okumada sorunlara neden olabilir ve isim çatışması olduğunda Erlang'da (Elixir'i etkileyen dil) önerilmez . Ancak Elixir'de böyle bir kural yoktur, kendi sorumluluğunuzdadır kullanabilirsiniz.
Python'da aynı etki şu şekilde yapılabilir:
from math import *
ve sadece bazı özel senaryolarda / etkileşimli modda kullanılması önerilir - daha kısa / hızlı yazma için.
kullan ve gerektir
Yapan use/ requirefarklı kılan şey, "makro" ile - Python / Java / Golang ... ailesinde bulunmayan kavramla - ilişkili olmalarıdır.
Sen gerekmez importfonksiyonları kullanmak için bir modül, ancak gerek requirekendi makroları kullanmak için bir modül :
iex()> Integer.mod(5, 3) # mod is a function
2
iex()> Integer.is_even(42)
** (CompileError) iex:3: you must require Integer before invoking the macro Integer.is_even/1
(elixir) src/elixir_dispatch.erl:97: :elixir_dispatch.dispatch_require/6
iex()> require Integer
Integer
iex()> Integer.is_even(42) # is_even is a macro
true
Gerçi is_evennormal bir fonksiyonu olarak yazılabilir, bu bir makro çünkü:
Elixir'de, Tamsayı.is_odd / 1, koruma olarak kullanılabilmesi için bir makro olarak tanımlanır.
https://elixir-lang.org/getting-started/alias-require-and-import.html#require
useElixir belgesinden alıntı yapmak için:
kullanımı, verilen modülü gerektirir ve daha sonra __using__/1modülün mevcut içeriğe bazı kodları enjekte etmesine izin veren geri aramayı çağırır .
defmodule Example do
use Feature, option: :value
end
derlendi
defmodule Example do
require Feature
Feature.__using__(option: :value)
end
https://elixir-lang.org/getting-started/alias-require-and-import.html#use
Yani yazmak yazmakla use Xaynı
require X
X.__using__()
use/2 bir makrodur , makro kodu sizin için başka bir koda dönüştürecektir.
Ne use MODULEzaman isteyeceksin:
- makrolarına erişmek istiyorum (
require)
- VE yürüt
MODULE.__using__()
Elixir 1.5'te test edildi
import Modulemodülünüzde kullanılacak işlevleri getirir.use Modulekullanılacak işlevleri getirir VE bunları modülünüzde herkese açık olarak gösterir