2013-04-30 78 views
1

我想知道是否可以從傳遞給Each的塊中放置的for循環中返回到Ruby中的每個迭代器。從For循環返回到每個迭代器

def find member = "" 

     productHash = {} 

      #@entries is a hash, with both the keys and values being strings 
      #the member parameter is a string 

     @entries.each do |key, value| 

      for i in 0...member.size 

       if(key[i] != member[i]) 
        next #the next keyword doesn't work...all it does is return to the for iterator. I'm looking for a keyword that would return to the each iterator, and allow each to pass back in the next key-value pair. 
       end 

      end 

      productHash[key] = value 


     end 

     productHash 

end 

我試圖做到這一點是:我看到,在成員參數的字符不會在一個給定的密鑰相匹配相應的字符的那一刻,我移動到下一個鍵值對。

+2

你爲什麼要使用一個for循環?你爲什麼不用塊來做每種方法? – jason328 2013-04-30 23:36:16

+0

@ jason328這會有幫助嗎?我相信這個問題仍然是一樣的。我在這裏使用for循環的原因是,爲了與參數「member」中的相應字符進行比較,我可以跟蹤索引號。我想概念上我的問題是,任何返回語句(例如break,next,return)是否區分for循環迭代器和每個迭代器。 – voltair 2013-04-30 23:44:55

+0

我很難理解你的問題。會使用'each_with_index'幫助你嗎? – jason328 2013-04-30 23:51:47

回答

1

它看起來像你試圖做一些比較,如果密鑰匹配member指定的特定前綴,那麼你會做一個任務。

此代碼應該是功能類似:

def find(member = "") 
    hash = { } 

    @entries.each do |key, value| 
    # Unless key begins with prefix, skip it. 
    next unless (key[0, prefix.length] == prefix) 

    hash[key] = value 
    end 

    hash 
end 

有Ruby中沒有官方goto語句,很多人認爲這是一件好事,但它意味着破壞了嵌套塊可以是一個有點棘手。

不過,如果您以正確的方式解決問題,幾乎總會有一個足夠優雅的解決方案。

更新:

爲了打破嵌套循環出來,這種方法可能是:

list.each do |i| 
    broken = false 

    inner_list.each do |j| 
    if (j > 10) 
     broken = true 
     break 
    end 
    end 

    break if (broken) 
end 
+0

非常感謝你!只是爲了驗證,是否沒有辦法從for循環中退出到我的代碼中的每個迭代器? – voltair 2013-05-01 02:38:20

+0

說實話,沒有人在Ruby中使用'for',除了以前曾經使用Ruby的人。代替使用'each'迭代器或Enumerable中的其他東西。要退出兩個級別,如果可以立即退出該方法,「返回」通常會起作用。另外,如果設置了條件,則設置一個標誌和「break」,然後再次「break」。 – tadman 2013-05-01 02:43:41

+0

我已經用一個簡短的例子修改了我的答案。 – tadman 2013-05-01 02:46:25