2016-06-19 12 views
0

Rubyでハッシュを学んでいます。 私はハッシュを任意の変数に代入したり要素を削除したりせずに反復しようとしています。 {a: 1, b: 2, c: "Hello"}.each{|k,v| self.delete(k)}。私はまた、thisselfを交換しようとしたが、それはどちらも動作しませんでした自分自身でハッシュのキーを使って要素を削除する

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

このエラーが発生します。とにかく、私はハッシュ(deleteのような)のメソッドを(hash_var.each {|k,v| hash_var.delete(k)}のような)変数にハッシュを割り当てないで使用できますか?私はc9 IDEを使用しています。

+0

私はハッシュで遊びたいです。ある例では、 'number = {a:1、b:2、c:3}; number.each {| k、v | v <3の場合はnumber.delete(k) 'となります。変数にハッシュを割り当てるのではなく、{a:1、b:2、c:3}で直接作業することで、同じことをすることができます。 –

答えて

2

ルビでは、self変数には、ブロックを含むオブジェクトへのリンクが含まれています。あなたのサンプルでは、​​これはmainオブジェクトです。ですから、ブロック内の変数hash_varを明示的に指定する必要があります。

また、ハッシュからすべてのキーを削除したいようです。だから、ハッシュ

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

よりの選択した項目を削除するには、delete_ifの代わりeachを使用します。 http://apidock.com/ruby/Hash/delete_if

それとも、あなたはvaluesメソッドを使用する必要があり、ハッシュからすべてのキーを削除してから配列を取得したい場合:

を「任意の変数に代入せずにハッシュを反復するために、」あなたの質問に答える
{a: 1, b: 2, c: "Hello"}.values 
+0

ありがとうございます。私はちょうど興味があり、ハッシュ変数でそうするようにハッシュで直接作業しようとしています。 –

2

:1が使用する可能性がありますObject#tap

{a: 1, b: 2, c: "Hello"}.tap { |h| h.each { |k,v| h.delete(k) } } 
#⇒ {} 
関連する問題