묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결함수형 프로그래밍과 JavaScript ES6+
reduce의 acc가 없는 경우 코드에 의문이 있어 질문드립니다.
안녕하세요! 초기값 acc가 없는 경우 iter에서 첫 값을 acc로 지정하고 next() 메서드를 통해 두번째 값부터 f(acc, a)를 누적하는 로직에서 궁금한 점이 있어 질문 남깁니다. 인자에 acc가 부재한 경우 if(!iter) 조건이 아니라 if(!acc) 조건으로 iter의 첫 값을 acc에 지정해주는 게 맞지 않나 싶었습니다. 해당 부분 시작 전에도 JS 내장 reduce 방식처럼 acc가 없는 경우 사용하는 방식이라고 소개하셔서 코드 부분에서 더 괴리가 있는 것 같습니다. 또한 acc[Symbol.iterator](); 의 경우 acc는 초기값이고, iterator 프로토콜을 따르는 배열은 인자로 주어진 iter니까 iter[Symbol.iterator]()가 맞지 않나요? const reduce = (f, acc, iter) => { if (!iter) { iter = acc[Symbol.iterator](); acc = iter.next().value; } ... } 강의에서는 위와 같이 작성해주셨는데, 제가 생각했을 때 이해가 되는 코드는 아래와 같습니다. const reduce = (f, iter, acc) => { if (!acc) { iter = iter[Symbol.iterator](); acc = iter.next().value; } ... } acc가 없는 경우 인자가 2개가 들어온다고 생각하면, acc를 3번째 인자로 두어야 acc가 undefined라 !acc가 true 처리되어서 if문을 돌 것 같아서 순서를 바꿔보았습니다. 제가 배움이 얕아 잘못 생각하고 있는 것이라면 어떤 부분에서 잘못 생각하고 있는건지 여쭙고 싶습니다. 감사합니다. ----- 라고 생각했는데, 아예 iter랑 acc를 재지정해주셨다는 걸 알게 되었습니다. 다른 수강생들에게도 도움이 되기 위해 정리해보는데, 혹시 오류가 있다면 짚어주시면 감사하겠습니다. 초기값(acc)이 함수로 전달되지 않는 경우 인자가 당겨져서 if 문 이전까지는 acc가 iterable(배열)이고, iter가 부재해undefined가 됩니다. 그러면 초기값이 없다는 if 문의 판별 조건은 (!iter)가 됩니다. if문 내부에서는 acc가 iterable이니 이를 iter로 다시 지정하는 것이고, acc는 단어 뜻 그대로 초기값으로 설정하기 위해 iter.next().value로 iterable의 첫 값으로 지정합니다. next()를 해서 iterable은 두 번째 값부터 for문에서 iteration을 진행하게 됩니다. iter와 acc 단어 자체의 의미에 집중하다보니 이해가 되지 않았는데, 당겨진다고 생각하니까 바로 납득이 되네요. 오류가 있다면 지적 부탁드립니다. 감사합니다!
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
const result = yield call(logInAPI)
function* logIn(action) { try { const result = yield call(logInAPI); yield put({ type: "LOG_IN_SUCCESS", data: result.data, }); } catch (err) { yield put({ type: "LOG_IN_FAILURE", data: err.response.data, }); } } const result = yield call(logInAPI); 항목 질문인데요 제너레이터 함수 문법은 yield까지 실행하고 종료해서 next()로 다시 함수내 다음문 실행을 거듭하는 특이한 함수로 알고 있는데요 yield로 받아지는 식별자 const result는 .next(인자)에서의 인자가 다음번 실행때 들어가는것 아닌가요? yield에서 만든 값은 이터레이터의 value값이 되는거고 식별자 result에 포함되지는 않다고 알고 있는데 어떻게 이해하는게 좋을까요