我正在学习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。
答案 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) } }
#⇒ {}