Elixir - Takma Adlar

Yazılımın yeniden kullanımını kolaylaştırmak için Elixir üç yönerge sağlar - alias, require ve import. Ayrıca, aşağıda özetlenen kullanım adı verilen bir makro sağlar -

# Alias the module so it can be called as Bar instead of Foo.Bar
alias Foo.Bar, as: Bar

# Ensure the module is compiled and available (usually for macros)
require Foo

# Import functions from Foo so they can be called without the `Foo.` prefix
import Foo

# Invokes the custom code defined in Foo as an extension point
use Foo

Şimdi her bir yönergeyi ayrıntılı olarak anlayalım.

takma ad

Alias ​​yönergesi, herhangi bir modül adı için takma adlar belirlemenize izin verir. Örneğin, bir takma ad vermek istiyorsanız'Str' String modülüne, basitçe yazabilirsiniz -

alias String, as: Str
IO.puts(Str.length("Hello"))

Yukarıdaki program aşağıdaki sonucu üretir -

5

Bir takma ad verilir String modül olarak Str. Şimdi, Str hazır bilgisini kullanarak herhangi bir işlevi çağırdığımızda, aslındaStringmodül. Bu, çok uzun modül adları kullandığımızda ve mevcut kapsamda daha kısa olanları değiştirmek istediğimizde çok yararlıdır.

NOTE - Takma adlar MUST büyük harfle başlayın.

Takma adlar yalnızca içinde geçerlidir lexical scope bunlar çağrılır. Örneğin, bir dosyada 2 modülünüz varsa ve modüllerden birinde bir takma ad yaparsanız, bu takma ada ikinci modülde erişilemez.

Dahili modüle erişmek için String veya Tuple gibi bir yerleşik modülün adını başka bir modüle takma ad olarak verirseniz, bunu başına eklemeniz gerekir. "Elixir.". Örneğin,

alias List, as: String
#Now when we use String we are actually using List.
#To use the string module: 
IO.puts(Elixir.String.length("Hello"))

Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu üretir -

5

gerek

Elixir, bir meta programlama mekanizması olarak makrolar sağlar (kod üreten kod yazma).

Makrolar, derleme zamanında çalıştırılan ve genişletilen kod parçalarıdır. Bu, bir makroyu kullanmak için, modülünün ve uygulamasının derleme sırasında kullanılabilir olduğunu garanti etmemiz gerektiği anlamına gelir. Bu,require direktif.

Integer.is_odd(3)

Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu üretecektir -

** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1

İksirde, Integer.is_odd olarak tanımlanır macro. Bu makro bir koruma olarak kullanılabilir. Bu, çağırmak içinInteger.is_oddTamsayı modülüne ihtiyacımız olacak.

Kullan require Integer programı aşağıda gösterildiği gibi çalıştırın.

require Integer
Integer.is_odd(3)

Bu sefer program çalışacak ve çıktıyı şu şekilde üretecektir: true.

Genel olarak, o modülde bulunan makroları kullanmak istememiz dışında, kullanımdan önce bir modül gerekli değildir. Yüklenmemiş bir makroyu çağırma denemesi bir hataya neden olur. Takma ad yönergesi gibi, require'in de sözcüksel kapsamda olduğunu unutmayın . Daha sonraki bir bölümde makrolar hakkında daha fazla konuşacağız.

ithalat

Kullanıyoruz importtam yetkili adı kullanmadan diğer modüllerden işlevlere veya makrolara kolayca erişme yönergesi. Örneğin, kullanmak istiyorsakduplicate List modülünden birkaç kez işlev görürseniz, kolayca içe aktarabiliriz.

import List, only: [duplicate: 2]

Bu durumda, List'den yalnızca yinelenen işlevi (argüman listesi uzunluğu 2 ile) içe aktarıyoruz. olmasına rağmen:only isteğe bağlıdır, belirli bir modülün tüm işlevlerinin ad alanı içine aktarılmasını önlemek için kullanılması önerilir. :except işlevler listesi dışında bir modüldeki her şeyi içe aktarmak için bir seçenek olarak da verilebilir.

import direktif ayrıca destekler :macros ve :functions verilmek üzere :only. Örneğin, tüm makroları içe aktarmak için bir kullanıcı yazabilir -

import Integer, only: :macros

İçe aktarmanın da Lexically scopedtıpkı zorunlu ve takma ad yönergeleri gibi. Ayrıca şunu unutmayın'import'ing a module also 'require's it.

kullanım

Yönerge olmasa da, use yakından ilişkili bir makrodur requirebu, mevcut bağlamda bir modülü kullanmanıza izin verir. Kullanım makrosu, geliştiriciler tarafından sıklıkla modüller olmak üzere mevcut sözcük kapsamına harici işlevsellik getirmek için kullanılır. Kullanım direktifini bir örnekle anlayalım -

defmodule Example do 
   use Feature, option: :value 
end

Kullanım, yukarıdakileri -

defmodule Example do
   require Feature
   Feature.__using__(option: :value)
end

use Module önce modülü gerektirir ve ardından __using__Modül üzerindeki makro. Elixir'in harika meta programlama yetenekleri vardır ve derleme zamanında kod üretmek için makroları vardır. _ _Using__ makrosu yukarıdaki örnekte çağrılır ve kod yerel bağlamımıza enjekte edilir. Yerel bağlam, derleme sırasında kullanım makrosunun çağrıldığı yerdir .