哈希键的 Ruby 值是什么?

48

我有一个Ruby哈希表的值列表。有没有一种方法可以检查键的值,如果它等于“X”,那么执行“Y”?

我可以使用hash.has_key?来测试哈希表是否具有键, 但现在我需要知道如果哈希表的键等于“X”,那么就...

6个回答

79

哈希表使用方括号([])进行索引,就像数组一样。但是与使用数值索引相反,哈希表使用字符串字面量或符号作为索引键。因此,如果您的哈希表类似于

hash = { "key1" => "value1", "key2" => "value2" }

你可以通过以下方式访问该值:

hash["key1"]
或者用于
hash = { :key1 => "value1", :key2 => "value2"}

或者在 Ruby 1.9 中支持的新格式

hash = { key1: "value1", key2: "value2" }

你可以使用以下方式获取该值:

hash[:key1]

为了使用字符串定义的键访问符号2中的值,我必须执行以下操作: hash[:"#{key_var}"] - HenriTel

14

这个问题似乎存在歧义。

我会尝试根据我的理解来回答这个问题。

def do_something(data)
   puts "Found! #{data}"
end

a = { 'x' => 'test', 'y' => 'foo', 'z' => 'bar' }
a.each { |key,value| do_something(value) if key == 'x' }

这将循环遍历所有的键值对,仅在键为'x'时执行某些操作。


14

作为例子,对于 @Intrepidd 的回答,有些情况下你需要使用fetch而不是[]。为了防止在键未找到时抛出异常,可以向fetch传递一个默认值。

puts "ok" if hash.fetch('key', nil) == 'X'

参考资料:https://docs.ruby-lang.org/en/2.3.0/Hash.html


4
这个怎么样?
puts "ok" if hash_variable["key"] == "X"

您可以使用[]运算符访问哈希值


2
看起来你的问题可能有点含糊不清。
如果第一句中的“values”指的是任何通用值(即对象,因为在Ruby中,一切都可以视为对象),那么其他答案中可能已经告诉你需要知道的内容(例如使用Hash#[](例如hash[some_key])查找与键关联的值)。
然而,如果第一句中的“values”被认为是“键值对”的值部分(存储在哈希表中),那么你的问题似乎可能是关于反向工作的(给定值的键)。
你可以使用Hash#key找到导致某个值的一个键。
ruby-1.9.2-head :001 > hash = { :a => '1', :b => :two, :c => 3, 'bee' => :two }
 => {:a=>"1", :b=>:two, :c=>3, "bee"=>:two} 
ruby-1.9.2-head :002 > a_value = :two
 => :two 
ruby-1.9.2-head :003 > hash.key(a_value)
 => :b 

如果您使用的是早于1.9版本的Ruby,可以使用Hash#index
当有多个键具有所需值时,该方法只会返回其中一个。如果您想要给定值的所有键,则可能需要进行一些迭代:
ruby-1.9.2-head :004 > hash[:b] == hash['bee']
 => true 
ruby-1.9.2-head :005 > keys = hash.inject([]) do # all keys with value a_value
ruby-1.9.2-head :006 >       |l,kv| kv[1] == a_value ? l << kv[0] : l
ruby-1.9.2-head :007?>   end
 => [:b, "bee"] 

一旦你有了指向值的键(或键),就可以使用 if/unless/case 表达式、接受块的自定义方法等进行比较和操作。如何比较它们取决于你用作键的对象类型(人们通常使用字符串和符号,但 Ruby 哈希表可以使用任何类型的对象作为键(只要它们在充当键时没有被修改))。

2

我不是很清楚你的问题,但是根据我的理解,我认为这可能是你正在寻找的(基于我的理解)

  person =   {"name"=>"BillGates", "company_name"=>"Microsoft", "position"=>"Chairman"}

  person.delete_if {|key, value| key == "name"} #doing something if the key == "something"

  Output: {"company_name"=>"Microsoft", "position"=>"Chairman"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接