2016-10-11 85 views
1

對於個人Hash執行,我想創建的mapmap!,即一個拍着版本,改變當前對象,就像存在Array的一個版本。當一個塊已定,那麼執行下面似乎正常工作:紅寶石:實現函數返回一個枚舉

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,就像下面的例子:

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

我要補充到我的函數,使其返回枚舉器時,塊沒有給出?

回答

-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]}; a#=> [[2,0],[4,1],[6,2]]'。 –

+1

上面的例子可能會更清晰一些,如下所示。 a = [1,2,3];枚舉= a.map! #=>#<枚舉器:[1,2,3]:map!>; enum.with_index {| n,i | [2 * n,i]}#=> [[2,0],[4,1],[6,2]]; a#=> [[2,0],[4,1],[6,2]]'。 –