如果 Ruby 的哈希键包含某个文本,返回哈希键。

3

我有一个哈希表如下:

hash = {2013 => 'one', 2014 => 'two'}

还有一个变量 number:

number = 13

我需要遍历所有的哈希键,如果某个键包含了 number,就返回该键。目前我的代码如下:

if hash.keys.any? {|k| k.include? number}
  #do some work
end

这样做可以,但实际上如果k包含number,我需要返回k,而不仅仅是检查它。如何像上面那样轻松地在"if"块格式中编写它。


你的意思是要检查键的字符串表示是否包含数字的字符串表示吗? - Chuck
你的代码段出现了错误(字符串与整数比较),请看一下 Array.find 方法:´hash.keys.find {|k| k.to_s.include? number.to_s}´。 - mestachs
当你说“包括”时,是否指子字符串?例如2013中 “包括” 13 - Matt
3个回答

4
使用 find
if result = hash.keys.find {|k| k.include? number}
  #do some work
end

1
在这种情况下,我该如何获取密钥?我需要能够使用在我的#做一些工作块中找到的密钥。 - Luigi
啊,很容易...谢谢,对于混淆感到抱歉。 - Luigi

1
if kv = hash.find { |k,v| k.to_s[number.to_s] }
  # do some work
end

例如,如果number = 13,那么在块中kv == [2013,“one”]。 如果未找到,则kvnil,并跳过该块。

+1 我喜欢使用 [...] 来查找字符串中的子串。 - the Tin Man
但我根本不喜欢看到 if kv =...,所以打-1。嗯,我只是觉得这可能会成为一个麻烦的地方和维护问题,并在代码审查中标记它。 - the Tin Man

1
您需要将两个值转换为字符串,然后只需检查一个字符串是否包含另一个字符串。类似于这样:

您想要将两个值转换为字符串,然后只需检查一个字符串是否包含另一个字符串。类似于这样:

hash.keys.select {|key| key.to_s.include? number.to_s }

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