Python / Java / Golang dillerinden gelen geçmişle, import
vs use
de 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 MODULE
işlevleri kullanmadan önce yapmanız gerekir , örneğin Python
In []: import math
In []: math.sqrt(100)
Out[]: 10.0
O zaman import
Elixir'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 sqrt
yerine Integer.sqrt
, trim
yerine String.trim
, import
irade 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
/ require
farklı kılan şey, "makro" ile - Python / Java / Golang ... ailesinde bulunmayan kavramla - ilişkili olmalarıdır.
Sen gerekmez import
fonksiyonları kullanmak için bir modül, ancak gerek require
kendi 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_even
normal 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
use
Elixir belgesinden alıntı yapmak için:
kullanımı, verilen modülü gerektirir ve daha sonra __using__/1
modü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 X
aynı
require X
X.__using__()
use/2
bir makrodur , makro kodu sizin için başka bir koda dönüştürecektir.
Ne use MODULE
zaman isteyeceksin:
- makrolarına erişmek istiyorum (
require
)
- VE yürüt
MODULE.__using__()
Elixir 1.5'te test edildi
import Module
modülünüzde kullanılacak işlevleri getirir.use Module
kullanılacak işlevleri getirir VE bunları modülünüzde herkese açık olarak gösterir