2016-10-11 1 views
1

을 반환하는 기능을 구현하는, 내가 Array을 위해 존재하는 것 같이, 현재의 객체를 변경하는 버전을 즉 map, map!의 부딪 혔어요 버전을 생성하고 싶습니다.루비 : 개인 <code>Hash</code> 구현을위한 열거

h.map 
=> #<Enumerator: {1=>2, 12=>21, 6=>3}:map> 

내가 무엇을 추가해야합니다 : 블록없이 호출

class MyHash < Hash 

    def map! &block 
    self.map { |ek, ev| self[ek] = block[ev] } if block_given? 
    # how to return the Enumerator if block not given? 
    end 

end 

에서, hash.map은 아래의 예처럼, Enumerator를 반환 블록이 주어지면, 구현은 아래 제대로 작동하는 것 같다 블록이 주어지지 않을 때 열거자를 반환하도록 내 함수에?

답변

-1

난 당신의 코드가 무엇을 얻을 수는 없지만 self.each를 반환 할 시도 할 수 있습니다 :

def map! &block 
    if block_given? 
     self.map { |ek, ev| self[ek] = block[ev] } 
    else 
     self.each 
    end 
end 
+1

를 사용하여 놀라 울 정도로 간단합니다 그들 자신. OP는 블록이 단순히 각 키에 새로운 값을 반환하기를 원합니다. – Max

2

을이이 과제를 수행하는 메소드 호출에 의존 Object#to_enum

class MyHash < Hash 
    def map! 
    if block_given? 
     each { |k, v| self[k] = yield v } 
    else 
     to_enum :map! 
    end 
    end 
end 
+0

예를 들어 주시겠습니까? 블록이 주어지지 않을 때 어떻게 사용됩니까? –

+1

예 :'a = [1,2,3]; a.map! .with_index {| n, i | [2 * n, i]}; a2 => [[2, 0], [4,1], [6,2]]. –

+1

위 예제를 다음과 같이 작성하는 것이 더 명확 할 수 있습니다. a = [1,2,3]; enum = a.map! # => # <열거 자 : [1, 2, 3] : map!>; enum.with_index {| n, i | [2 * n, i]} # => [[2, 0], [4,1], [6,2]]; a2 => [[2, 0], [4,1], [6,2]]. –