使用哈希中的键使用self删除元素

时间:2016-06-19 10:08:55

标签: ruby hash

我正在学习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>'

我还尝试将self替换为this,但它既不起作用也不起作用。无论如何我可以使用散列方法(如delete)而不将散列分配给变量(如hash_var.each {|k,v| hash_var.delete(k)})?我正在使用c9 IDE。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

回答你的问题“迭代哈希而不将其分配给任何变量”:可以使用Object#tap

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