2014-01-30 68 views
0

我試圖重新創建#select方法。到目前爲止,我有陣列部分工作,但是當我嘗試在哈希上調用#my_select時,我得到一個空的哈希。對於初學者,我不得不重新創建自己的`#each'方法。就是這樣。如何重新創建.select()?

module Enumerable 

def my_each 
    i = 0 
    while i < self.size 
     yield(self[i]) 
     i += 1 
    end 
    self 
end 

現在,這裏的#my_select方法我創建:

def my_select 
    if self.instance_of?(Array) 
     ret = [] 
     self.my_each do |item| 
      ret << item if yield(item) 
     end 
     ret 
    elsif self.instance_of?(Hash) 
     ret = {} 
     self.my_each do |key, value| 
      if yield(key,value) 
       ret[key] = value 
      end 
     end 
     ret 
    end 
    end 
end 

...我的輸入/輸出...

> h = { "a" => 100, "b" => 200, "c" => 300 } 
> h.select { |k,v| k == "a"} 
=> {"a"=>100} 
> h.my_select { |k,v| k == "a"} 
=> {} 
+0

請問您還可以顯示my_each方法嗎? – vidaica

+1

我通過用'each'替換'my_each'來解決問題。因此'your_each'錯誤或拼寫錯誤'Enumerable'也可能是一個問題。 – oldergod

+1

我得到了和@oldergod相同的結果。如果您想編輯您的問題以包含'my_each',我們可以看到問題是否存在。考慮使用'case self',然後'當Array','Hash'。 –

回答

2

也許你可以改變my_each處理Hash以及?

def my_each 
    if self.instance_of?(Array) 
     i = 0 
     while i < self.size 
      yield(self[i]) 
      i += 1 
     end 
     self 
    elsif self.instance_of?(Hash) 
     i = 0 
     arr = self.to_a 
     while i < arr.size 
      yield(arr[i][0], arr[i][1]) 
      i += 1 
     end 
     self 
    end 
    end 
+0

你應該用yield(arr [i])替換yield(arr [1],arr [2])' – vidaica

+0

然後它會產生'[k,v]'。但'Hash.each',yeilds'k,v'對不對?還是我混淆的東西? –

+1

除了產生'k,v',你可以將'[k,v]'作爲一個數組產生。如果你仍然想要產生'k,v',你應該用yield(arr [i] [1],arr [i] [2])替換yield(arr [1],arr [2])' – vidaica