2017-12-29 28 views
0

엘릭서에서 인덱스를 반복하는 방법을 이해할 수 없습니다.엘릭서의지도 목록을 반복하는 방법은 무엇입니까?

예를 들어, 나는 자바에서이 조각을하고 난 비약로 번역 할 :

for(int i = 1; i < list.size(); i++) { 
    list.order = i; 
} 

list는 엘릭서에서지도의 목록입니다 말할 수 있습니다. 필자는 Elixir 방식으로 이것을 수행하거나 일부 인덱스 변수로 반복하는 방법을 이해할 수 없습니다.

답변

2

저스틴에 의한 대답은 완벽하게 유효하지만, 관용적 만능 솔루션은 Enum.with_index/2 사용하는 것입니다 :

list = ~w|a b c d e| 
list 
|> Enum.with_index() 
|> Enum.each(fn {e, idx} -> IO.puts "Elem: #{e}, Idx: #{idx}" end) 

#⇒ Elem: a, Idx: 0 
#⇒ Elem: b, Idx: 1 
#⇒ Elem: c, Idx: 2 
#⇒ Elem: d, Idx: 3 
#⇒ Elem: e, Idx: 4 
+0

I을 두 가지 해결책 모두 훌륭하다고 생각하지만이 점은 제가 이해하기가 더 쉬워 보입니다. –

+0

'Enum.with_index'는'Map'의 값을 업데이트 할 수 있습니까 (단순히 반복하는 것보다는 OP가 필요하다고 생각한 것입니까)? –

+0

@JustinNiessner'Enum.with_index'는 아무것도 _allow_ 또는 _disallow_하지 않습니다. 요소를 전달하여 인덱스를 추가하고 튜플을 반환합니다. 만약 입력이'map'으로 업데이트된다면 마지막 파이프 라인 행에서'Enum.each' 대신'Enum.map' 또는'Enum.reduce'를 사용해야합니다. 엘릭서에는 "맵 업데이트"와 같은 것이 _no_ 있습니다. 그럼에도 불구하고 결과는 새로운지도입니다. – mudasobwa

3

데이터의 변형을 허용하지 않는 언어로 작업하는 경우 컬렉션 및 설정 값을 반복하는 것만 큼 간단하지 않습니다. 대신 필드가 설정된 새 개체로 새 컬렉션을 만들어야합니다.

엘릭서, 당신이 할 수있는 foldl :

List.foldl(
    list, 
    (1, map), 
    fn(l, (i, map)) -> (i+1, Map.update(map, :some_key, $(i))) 
)