필자는 일련의 erlang 레코드에서 깊이 중첩 된 값을 증가시킬 필요가 있다고 생각했습니다. 명부 작성으로 이것을하는 나의 첫번째 시도는 암울한 실패이었다. 원래 목록에는 대상 값이없는 레코드가 여러 개 포함되어 있습니다. 레코드를 포함하고있는 레코드가 어떤 수준에서는 정의되지 않았기 때문입니다.Erlang에서는 깊이 중첩 된 레코드의 조작을 어떻게 "이해할 수 있습니까?"
목록을 사용하면 쉽게 처리 할 수 있습니다. 파티션은 실제로 증가가 필요한 항목 만 필터링하여 필터링하지만 그와 같은 간단한 작업을 수행 할 수있는 목록 이해가 부족합니다.
아래의 코드 샘플은 컴파일되지 않을 것입니다. 단순히 달성하려고 시도한 것을 보여주기위한 것입니다. 나는 내 원래의 문제를 설명하기 위해 섹션은 "정의되지 않은 경우 (ㅋ)"를 넣어 : 내가 함께 무엇을 시작했다
-record(l3, {key, value}).
-record(l2, {foo, bar, a_thing_of_type_l3}).
-record(l1, {foo, bar, a_thing_of_type_l2}).
increment_values_recursive([], Acc
increment_values_recursive([L1 | L1s], Acc) ->
case L1#l1.a_thing_of_type_l2 of
undefined -> NewRecord = L1;
L2 ->
case L2#l2.a_thing_of_type_l3 of
undefined -> NewRecord = L2;
{Key, Value} ->
NewRecord = L1#l1{l2 = L2#l2{l3 = {Key, Value + 1}}}
end
end,
increment_values_recursive(L1s, [NewRecord | Acc]).
increment_values(L1s) ->
lists:reverse(increment_values_recursive(L1s, [])).
........
NewList = increment_values(OldList).
을하지만, 나는이 때 목록을 처리 할 지능형리스트를보고 드리겠습니다 정의되지 않은 멤버를 확인할 필요가 없었습니다. 정말 이런 식으로 뭔가 :
increment_values_recursive([], Acc
increment_values_recursive([L1 | L1s], Acc) ->
%I'm VERY SURE that this doesn't actually compile:
#l1{l2 = #l2{l3 = #l3{_Key, Value} = L3} = L2} = L1,
%same here:
NewRecord = L1#l1{l2=L2#l2{l3=L3#l3{value = Value+1}}},
increment_values_recursive(L1s, [NewRecord | Acc]).
increment_values(L1s) ->
lists:reverse(increment_values_recursive(L1s, [])).
AKA는 :
typedef struct { int key, value; } l3;
typedef struct { int foo, bar; l3 m_l3 } l2;
typedef struct { int foo, bar; l2 m_l2 } l1;
for (int i=0; i<NUM_IN_LIST; i++)
{
objs[i].m_l2.m_l3.value++;
}
@Peer와 같이 도우미 기능을 사용하면 Stritzinger가 매우 쉽게 읽을 수 있습니다. 함수를 정의하지 않으려면 대신 재미를 사용하십시오. 이 경우 나는 축적하고 뒤집을 필요가 없다. – rvirding
당신은 절대적으로 정확합니다. 도우미 기능 또는 2 가지를 사용하면 이것은 사소하고 읽기 쉽습니다. 나는 내가 쓰여진 것보다 더 많은 것을 읽었다 고 생각한다. 여기서는 바인딩 및 함수 호출을 최소화하는 것이 목표라고 가정했습니다. – Ben