2016-06-19 4 views
0

Ich lerne Hash in Ruby. Ich versuche, einen Hash zu wiederholen, ohne es einer Variablen zuzuweisen und seine Elemente zu löschen. {a: 1, b: 2, c: "Hello"}.each{|k,v| self.delete(k)}. Ich erhalte diese FehlerElement mit Schlüssel in Hash mit Selbst löschen

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>' 

Ich habe auch versucht self mit this zu ersetzen, aber es hat nicht funktioniert nicht. Kann ich trotzdem Hash-Methoden verwenden (wie delete), ohne den Hash einer Variablen zuzuordnen (wie hash_var.each {|k,v| hash_var.delete(k)})? Ich benutze c9 IDE.

+0

Ich möchte mit Hash spielen. In einem Beispiel ist "Nummer = {a: 1, b: 2, c: 3}"; number.each {| k, v | number.delete (k) wenn v <3} '. Ich denke, vielleicht kann ich dasselbe tun, indem ich direkt mit {a: 1, b: 2, c: 3} arbeite, anstatt den Hash einer Variablen zuzuweisen. –

Antwort

2

In Ruby enthält self Variable einen Link zu dem Objekt, das Ihren Block enthält. In Ihrem Beispiel ist dies main Objekt. Sie müssen also die Variable hash_var explizit in Ihrem Block angeben.

Auch scheint es, dass Sie alle Schlüssel aus Ihrem Hash löschen möchten. So delete_if anstelle von each zu ausgewählten Posten der

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

Mehr: http://apidock.com/ruby/Hash/delete_if

Oder, wenn Sie alle Schlüssel von Hash löschen möchten, und bekommen Array davon müssen Sie verwenden values Methode:

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

Danke. Ich bin nur neugierig und versuche direkt mit einem Hash zu arbeiten, so wie mit einer Hash-Variable. –

2

auf Ihre Frage zu beantworten „einen Hash iterieren, ohne es zu jeder variablen zuweisen“: man könnte verwenden Object#tap:

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