2015-04-18 10 views
5

Wiem, że można przekazać pojedynczą list do funkcji, a następnie iterować nad tym. Jednak wolę mieć funkcje z bardziej wyraźnym podpisem. Więc naprawdę chcę wiedzieć, czy Elixir ma coś, co jest równoważne z obiektem arguments w JavaScript.Czy istnieje sposób na powtórzenie wszystkich argumentów przekazanych do funkcji w eliksiru?

O ile mogę powiedzieć, odpowiedź brzmi nie. Najbliższe, jakie widziałem w dyskusji na ten temat, było w odpowiedzi na this question.

Powodem, dla którego szukam tej funkcji, jest to, że wielokrotnie stwierdziłem, że stosuję tę samą konwersję do wielu argumentów i jest to trochę uciążliwe. Czy możliwe jest to zaimplementowanie za pomocą makra?

Odpowiedz

11

Jest to możliwe, ale rzadko go używać:

nazywając binding() na szczycie funkcji daje listę słów kluczowych z wiązaniami w zakresie i ich wartości, które byłyby argumenty, jeśli nazywa to jest pierwsza linia twojej funkcji, czyli:

iex(6)> defmodule Mod do 
...(6)> def args(a, b, c) do 
...(6)>  for {arg, val} <- binding() do 
...(6)>  IO.puts "#{arg} = #{inspect val}" 
...(6)>  end 
...(6)> end 
...(6)> end 


iex(7)> Mod.args(1,2,3) 
a = 1 
b = 2 
c = 3 
[:ok, :ok, :ok] 
+2

Czy są jakieś wady? Czy to stylistycznie czy praktycznie? Wydaje mi się, że dokładnie to, czego chciałem. Czy to jest udokumentowane w dowolnym miejscu? –

+0

Myślę, że to dokładnie to, czego szukasz. http://elixir-lang.org/docs/stable/elixir/Kernel.html#binding/1 –