我有这样的东西:
array = [
hash1 = {"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
hash2 = {"darco"=>"johnson", "girth"=>"wide", "onion"=>false},
hash3 = {"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]
,其中一个且只有一个onion
在任何给定时间是true
。
我想要一个表达式或函数来返回变量的名称(即hash1
, hash2
),该变量持有onion
当前为true
的哈希值。我该怎么做呢?
这不可能。对象不知道引用它的变量
也可以通过将数组替换为哈希并制作:hash1
、:hash2
和:hash3
键来实现类似的效果。
假设我们有hash
变量:
hash.keys.select{|key| hash[key]['onion']}
但是如果您稍微放宽要求,允许冒号:
代替=
符号:
array = [
hash1: {"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
hash2: {"darco"=>"johnson", "girth"=>"wide", "onion"=>false},
hash3: {"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]
我们可以这样做:
-> *_, **p { p.find { |_, v| v["onion"] }.first }.( *array )
好吧,正如你在@Jörg W Mittag - 的评论部分所问的那样,是否有一种方法可以从数组的哈希中返回一个特定的键,其洋葱是真的(不是洋葱的键,虽然)?。是的,这是可能的,正如我下面所示:
这里我考虑了一个输入数组,其中存在多个Hash
,它们具有键onion的true
值。现在需要enum#find_all
来处理这种情况。
array = [
{"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
{"darco"=>"johnson", "girth"=>"wide", "onion"=>true},
{"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]
array.find_all{|i| i["onion"]== true}.map{|i| i.keys[0]}
#>>["marco", "darco"]
根据OP的输入数组,enum#find
可以工作。
array = [
{"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
{"darco"=>"johnson", "girth"=>"wide", "onion"=>false},
{"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]
array.find{|i| i["onion"] }.keys[0]
# => "marco"