2017-02-26 3 views
0

나는 엘 릭셔에 게임 엔진을 씁니다. (예, 본질적으로 그 언어에 적합하지 않습니다. 요점은 비정형 언어의 사용이 결과의 구조에 어떻게 영향을 미치는지를 보는 것입니다.) 따라서, 필자는 여러 감독자를 실행해야합니다. 게임 시작 -하지만 그들이 감독해야하는 것은 게임에 달려 있습니다. 내 생각에 튜플의 목록으로 config.exs 파일에 필요한 자식과 인수 및 옵션을 사용자 목록에 포함시킨 다음 감독자가 응용 프로그램 환경에서 해당 튜플을 가져 와서 해당 내용을에 대한 인수로 사용했습니다. worker\2 (또는 적절할 경우 worker\3).엘 릭실에서 함수의 인수로 튜플을 사용하십시오.

그러나 Python의 tuple-unpacking과 동일한 Elixir를 찾을 수 없습니다. 나는 간단한 기능이 특정한 경우에 그것을 자신을 할 수있는 :

def unpack_worker({module, args}) do 
    worker(module, args) 
end 

def unpack_worker({module, args, opts}) do 
    worker(module, args, opts) 
end 

그러나 그것은 기껏 서투른 느낌, 나는 이런 유형의 구성을해야 할 수있는 모든 기능을 다시 작성해야합니다.

답변

4

난 당신이 Tuple.to_list/1apply/3을 찾고 생각 unpack_worker({})이면 worker(), unpack_worker({:foo})worker(:foo) 등으로 전화 할 것입니다.

데모 :

defmodule A do 
    def worker, do: IO.puts 0 
    def worker(_), do: IO.puts 1 
    def worker(_, _), do: IO.puts 2 
    def worker(_, _, _), do: IO.puts 3 

    def unpack_worker(tuple), do: apply(__MODULE__, :worker, Tuple.to_list(tuple)) 
end 

A.unpack_worker({}) 
A.unpack_worker({:a}) 
A.unpack_worker({:a, :b}) 
A.unpack_worker({:a, :b, :c}) 

출력 :

0 
1 
2 
3 
1

요소에 올바르게 액세스하려면 튜플의 크기를 알아야한다고 생각합니다. 유스 케이스에 대한 더 나은 데이터 구조는 아마도 키워드 목록 일 것이고 특히 어쨌든 설정에서 얻은 결과라고 생각하면 될까요? 그런 다음 worker :, args :를 풀고 나머지는 옵션으로 남겨 둘 수 있습니까?

0

나는 elem/2tuple_size/1의 기능이 필요하다고 생각합니다.

iex(1)> a = {:foo, :bar, :baz} 
{:foo, :bar, :baz} 
iex(2)> tuple_size(a) 
3 
iex(3)> elem(a, 0) 
:foo 
iex(4)> elem(a, 5) 
** (ArgumentError) argument error 
    :erlang.element(6, {:foo, :bar, :baz}) 

튜플에없는 인덱스에서 요소를 요청하면 인수 오류가 발생합니다. 즉, 시도하고있는 것을 구별하기 위해 if/case/cond/여러 기능 헤드 등을 사용해야 할 것입니다.

def unpack_worker(args) do 
    apply(__MODULE__, :worker, Tuple.to_list(args)) 
end 

지금 호출하는 경우 : 당신이 튜플의 내용에 따라 올바른 인수에 대응의 함수를 호출 할 수 있습니다, 그와

:

관련 문제