我在帮手中有这个方法:
def get_hash_keys(hash)
hash.delete_if{|k, v| v.class != Hash}
return hash.keys
end
当我从同一帮助器中的另一个方法调用get_hash_keys
时,它返回一个空白数组:
def datas_size
sum = 0
new_hash = {title: "This is a test", datas: {firstname: "foo", lastname: "bar"}}
new_hash.each do |k, v|
sum += v.size if get_hash_keys(new_hash).includes? k
end
return sum
end
我测试过使用固定数组更改return hash.keys
,我明白了。只有keys
功能似乎不起作用。我还用params检查了我的数组。
我是否忽略了在助手内部工作的一些规范?
编辑@DRSE:
我从包含其他哈希的哈希开始。我需要知道每个孩子哈希的大小。关键是当我从视图中调用此函数(get_hash_keys)时,它会失败(返回空白数组),但是从控制台起作用(返回键)。
今天早上的更多调查让我得出结论,这可能是对delete_if的错误用法。我不明白的解决方案是取代:
def get_hash_keys(hash)
hash.delete_if{|k, v| v.class != Hash}
return hash.keys
end
与
def get_hash_keys(hash)
tmp_hash = hash.clone
tmp_hash.delete_if{|k, v| v.class != Hash}
return tmp_hash.keys
end
答案 0 :(得分:0)
hash.keys
没有错:
def get_new_keys(hash)
hash.delete_if{|k,v| k == :bar}
return hash.keys
end
get_new_keys({qux: :bar, bar: :baz}) # => [:qux]
另一方面,这是被破坏的。
def display_keys(hash)
return "foo " + get_new_keys(hash)
end
您是否希望退回array
?如果是这样的话,根本就没办法解决这个问题。你可以做类似的事情:
def display_keys(hash)
return [:foo].concat(get_new_keys(hash))
end
在这种情况下,它会执行以下操作:
def display_keys(hash)
return [:foo].concat(get_new_keys(hash))
end
display_keys({qux: :bar, bar: :baz}) # => [:foo, :qux]
答案 1 :(得分:0)
.keys
方法返回哈希中的键和数组。
您的问题无法回答有两个原因:
delete_if
区块中包含该条件。我的
猜测是你要删除散列中的所有键,所以.keys
是
返回[]
。另外,您的方法display_keys
在ruby 2.3
中不起作用。您不能像这样连接数组和字符串。它将抛出TypeError: no implicit conversion of Array into String
但是我最好的猜测下面的代码就可以了:
def get_new_keys(hash)
hash.delete_if{ |k,v| v % 2 == 0 }
return hash.keys
end
def display_keys(hash)
return ["foo"] + get_new_keys(hash)
end
hash = {
one: 1,
two: 2,
three: 3,
four: 4,
five: 5,
six: 6,
seven: 7,
eight: 8,
nine: 9,
ten: 10
}
输出:
pry(main)> display_keys( hash )
=> ["foo", :one, :three, :five, :seven, :nine]