Elixir - Aliasy

Aby ułatwić ponowne wykorzystanie oprogramowania, Elixir zapewnia trzy dyrektywy - alias, require i import. Zawiera również makro o nazwie użycie, które podsumowano poniżej -

# 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

Przyjrzyjmy się teraz szczegółowo każdej dyrektywie.

Alias

Dyrektywa alias umożliwia skonfigurowanie aliasów dla dowolnej nazwy modułu. Na przykład, jeśli chcesz nadać alias'Str' do modułu String możesz po prostu napisać -

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

Powyższy program generuje następujący wynik -

5

Alias ​​jest nadawany String moduł jako Str. Teraz, gdy wywołujemy dowolną funkcję przy użyciu literału Str, w rzeczywistości odwołuje się ona doStringmoduł. Jest to bardzo pomocne, gdy używamy bardzo długich nazw modułów i chcemy zastąpić je krótszymi w bieżącym zakresie.

NOTE - Aliasy MUST zacznij od dużej litery.

Aliasy są ważne tylko w ramach lexical scope są one wywoływane. Na przykład, jeśli masz 2 moduły w pliku i utworzysz alias w jednym z modułów, alias ten nie będzie dostępny w drugim module.

Jeśli podasz nazwę wbudowanego modułu, takiego jak String lub Tuple, jako alias do innego modułu, aby uzyskać dostęp do wbudowanego modułu, będziesz musiał dodać go przed "Elixir.". Na przykład,

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"))

Po uruchomieniu powyższego programu generuje następujący wynik -

5

wymagać

Elixir dostarcza makra jako mechanizm do metaprogramowania (pisania kodu, który generuje kod).

Makra to fragmenty kodu, które są wykonywane i rozwijane w czasie kompilacji. Oznacza to, że aby skorzystać z makra, musimy zagwarantować, że jego moduł i implementacja będą dostępne podczas kompilacji. Odbywa się to za pomocąrequire dyrektywa.

Integer.is_odd(3)

Po uruchomieniu powyższego programu wygeneruje następujący wynik -

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

W Elixirze, Integer.is_odd jest zdefiniowany jako macro. To makro może służyć jako ochrona. Oznacza to, że aby wywołaćInteger.is_odd, będziemy potrzebować modułu Integer.

Użyj require Integer funkcji i uruchom program, jak pokazano poniżej.

require Integer
Integer.is_odd(3)

Tym razem program uruchomi się i wyświetli dane wyjściowe jako: true.

Ogólnie rzecz biorąc, moduł nie jest wymagany przed użyciem, z wyjątkiem sytuacji, gdy chcemy użyć makr dostępnych w tym module. Próba wywołania makra, które nie zostało załadowane, spowoduje błąd. Zauważ, że podobnie jak dyrektywa aliasów, require jest również leksykalny . Więcej o makrach porozmawiamy w kolejnym rozdziale.

import

Używamy importdyrektywy, aby łatwo uzyskać dostęp do funkcji lub makr z innych modułów bez używania w pełni kwalifikowanej nazwy. Na przykład, jeśli chcemy użyćduplicate funkcji z modułu List kilka razy, możemy go po prostu zaimportować.

import List, only: [duplicate: 2]

W tym przypadku importujemy tylko funkcję duplicate (o długości listy argumentów 2) z listy. Mimo że:only jest opcjonalny, jego użycie jest zalecane, aby uniknąć importowania wszystkich funkcji danego modułu wewnątrz przestrzeni nazw. :except można również podać jako opcję, aby zaimportować wszystko w module oprócz listy funkcji.

Plik import dyrektywa obsługuje również :macros i :functions być dany :only. Na przykład, aby zaimportować wszystkie makra, użytkownik może napisać -

import Integer, only: :macros

Zauważ, że import też jest Lexically scopedpodobnie jak dyrektywy require i alias. Zwróć też na to uwagę'import'ing a module also 'require's it.

posługiwać się

Chociaż nie jest to dyrektywa, use to makro ściśle związane z requirektóry pozwala na użycie modułu w aktualnym kontekście. Makro użycia jest często używane przez programistów w celu wprowadzenia zewnętrznej funkcjonalności do aktualnego zakresu leksykalnego, często modułów. Zrozummy dyrektywę use na przykładzie -

defmodule Example do 
   use Feature, option: :value 
end

Use to makro, które przekształca powyższe w -

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

Plik use Module najpierw wymaga modułu, a następnie wywołuje __using__makro na module. Elixir ma świetne możliwości metaprogramowania i ma makra do generowania kodu w czasie kompilacji. W powyższym przykładzie wywoływane jest makro _ _using__ , a kod jest wstrzykiwany do naszego lokalnego kontekstu. Kontekst lokalny to miejsce, w którym w momencie kompilacji wywołano makro użycia .