map_if, collect_if

Tags:

1에서 5사이의 수에서 홀수만 * 10을 한 값을 반환하는 방법입니다. 즉 10, 30, 50이 답으로 나오게요.

irb(main):001:0> a = 1..5
=> 1..5

(1) Select를 사용한 방법

irb(main):006:0> a.select { |i| i % 2 != 0 }.map { |i| i * 10 }
=> [10, 30, 50]

(2) Inject를 사용한 방법

irb(main):007:0> a.inject([]) { |a, i| i[0] == 1 ? a.push(i * 10) : a }
=> [10, 30, 50]

Integer i에서 i[0]은 i의 0번째 비트를 반환합니다.

Comments

2 responses to “map_if, collect_if”

  1. 공성식 Avatar
    공성식

    inject를 사용한 방법은 간결한 대신 초보자들에게는 늘 혼란을 일으키더군요.

    더군다나 예로 드신 경우엔 block 내에서 a를 argument로 사용하는 바람에 block 바깥의 a를 hide했기 때문에 잘 모르시는 분들은 혼동하실 것 같아요.

    이렇게 고치는 게 좋을 것 같습니다.

    a.inject([]) { |memo, i| i[0] == 1 ? a.push(i * 10) : a }

    inject에 넘겨주는 block은 두 개의 인자를 받는데 첫번째 인자는 바로 이전 iteration의 결과입니다.
    그래서 보통 memo라는 이름을 많이 사용하더군요.

    제가 다른 방법 하나를 제시해 볼게요.

    a.map { |i| i * 10 if i % 2 == 1 }.compact

    썩 좋은 방법 같지는 않지만 그냥 이런 방법도 있다는 의미에서…

  2. MKSeo Avatar
    MKSeo

    역시 a보다는 memo 등이 나을 듯.
    compact소개해주셔서 감사해요^^

Leave a Reply

Your email address will not be published. Required fields are marked *