2016-06-19 34 views
0

我在Ruby學習哈希。 我正在嘗試迭代散列而不將它分配給任何變量並刪除它的元素。 {a: 1, b: 2, c: "Hello"}.each{|k,v| self.delete(k)}。我得到這個錯誤用自己的哈希刪除使用鍵的元素

2.3.0 :001 > {a: 1, b: 2, c: "Hello"}.each {|k,v| self.delete(k)} 
NoMethodError: undefined method `delete' for main:Object 
    from (irb):1:in `block in irb_binding' 
    from (irb):1:in `each' 
    from (irb):1 
    from /usr/local/rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>' 

我還試圖取代selfthis,但它沒有工作也沒有。無論如何,我可以使用散列方法(如delete)而不將散列分配給變量(如hash_var.each {|k,v| hash_var.delete(k)})?我正在使用c9 IDE。

+0

我想玩哈希。在一個例子中,'number = {a:1,b:2,c:3}; number.each {| k,v | number.delete(k)if v <3}'。我想也許我可以通過直接使用{a:1,b:2,c:3}來做同樣的事情,而不是將哈希分配給一個變量。 –

回答

2

在ruby中,self變量包含指向包含塊的對象的鏈接。在您的示例中,這是main對象。所以,你是對的,你必須在你的塊中明確地指定變量hash_var

此外,似乎你想從你的哈希中刪除所有的鍵。因此,使用delete_if而不是each刪除哈希

{a: 1, b: 2, c: "Hello"}.delete_if{|k,v| your_condition} 

更多的選擇項: http://apidock.com/ruby/Hash/delete_if

或者,如果你想刪除哈希的所有鍵和從它那裏得到數組必須使用values方法:

{a: 1, b: 2, c: "Hello"}.values 
+0

謝謝。我只是好奇,並試圖直接使用散列工作,就像使用散列變量這樣做。 –

2

回答您的問題「迭代散列而不將其分配給任何變量」:可以使用Object#tap

{a: 1, b: 2, c: "Hello"}.tap { |h| h.each { |k,v| h.delete(k) } } 
#⇒ {}