2017-09-26 4 views
2

저는 Elixir를 처음 접했고 기타 탭 문제를 해결하려고합니다. 내 코드 :익명 함수 내에서 명명 된 함수 변수 업데이트하기 Elixir

def sumTabs([head|tail], result) do 
     nextLine = hd(tail) 
     tail = List.delete(tail, nextLine) 
     head 
     |> Enum.with_index 
     |> Enum.each(fn({x, i}) -> 
      s = [x <> Enum.at(nextLine, i) |> to_charlist] 
      IO.inspect s 
      result = [result | s] 
      IO.inspect result end) 
     result 
    end 

내가 처음에 빈 목록 인 결과를 업데이트 할,하지만 Enum.each 기능의 각 반복에서, 결과가 비어 있습니다. 나는 그것이 익명의 기능 때문이라고 생각한다.

처음에는 최소한 두 줄을 사용하고 싶습니다.

입력 :

tab = """ 
    e|-7-----7-----7-----7-----5-----3-----3-----2-----0-----0-----| 
    B|---0-----0-----0-----0-----0-----0-----0-----0-----0-----0---| 
    G|-----0-----0-----0-----0-----0-----0-----0-----0-----0-----0-| 
    D|-------------------------------------------------------------| 
    A|-------------------------------------------------------------| 
    E|-------------------------------------------------------------| 
    """ 

출력 : sumTabs 기능 이전

['eB'] 
[[], 'eB'] 
['||'] 
[[], '||'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['7-'] 
[[], '7-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['5-'] 
[[], '5-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['3-'] 
[[], '3-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['3-'] 
[[], '3-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['2-'] 
[[], '2-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['0-'] 
[[], '0-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['0-'] 
[[], '0-'] 
['--'] 
[[], '--'] 
['-0'] 
[[], '-0'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['--'] 
[[], '--'] 
['||'] 
[[], '||'] 

코드 : 엘릭서에서

defmodule TabPlayer do 
    def parse(tab) do 
     String.split(tab, "\n") 
      |> Enum.map(fn n -> to_string n end) 
      |> List.delete([]) 
      |> Enum.map(fn n -> String.graphemes n end) 
      |> sumTabs([]) 
      |> IO.inspect 
    end 

답변

4

변수는 불변이다. Enum.each 안에 값을 재 할당 할 수 없으며 외부로 변경 될 것으로 예상됩니다. 이 코드가하는 일은 새로운 result 값을 만들어 익명 함수가 끝날 때까지 지속됩니다.

여기에서 Enum.reduce/3을 사용할 수 있으며 모든 반복마다 새 result 값을 반환합니다. 논리의 나머지 부분이 정확하다고 가정하면 Enum.reduce/3을 사용하도록 코드를 다시 작성하는 방법은 다음과 같습니다. 사실 IO.inspect이 값을 출력 한 다음이를 반환한다는 점을 참고하십시오. 따라서 IO.inspect(x); xIO.inspect(x)과 같습니다.

def sumTabs([head|tail], result) do 
    nextLine = hd(tail) 
    tail = List.delete(tail, nextLine) 
    head 
    |> Enum.with_index 
    |> Enum.reduce([], fn({x, i}, acc) -> 
    s = IO.inspect [x <> Enum.at(nextLine, i) |> to_charlist] 
    IO.inspect [s | acc] 
    end) 
    # We need to reverse at the end since we're creating a reversed list in 
    # `Enum.reduce` for efficiency. 
    |> Enum.reverse 
end 
+0

감사합니다. 하지만 다음 함수 호출을 위해 "acc"변수를 줄 수 있을까요? 아니면 나중에 어떻게할까요? – Projectionist

+0

'result = head |> ...'와 같이 최종 값을 저장할 수 있습니다. 'Enum.reduce'는'acc'의 마지막 값을 반환합니다. 그게 당신이 의미 한 것입니까? – Dogbert

+0

예, 완벽합니다, 감사합니다! – Projectionist