2013-12-17 28 views
2

我有一个哈希值,像这样:红宝石如果哈希键包括文本,返回散列键

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

和可变number

number = 13

我需要通过所有的搜索我的散列键,如果number包含在一个键中,我需要返回该键。现在,我有这样的:

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

这一工程,但我确实需要的情况下返回kk不包括number,不只是检查它。我怎样才能很容易地写在上面的块“if”格式。

+0

你的意思是你想检查密钥的字符串表示是否包含数字的字符串表示形式? – Chuck

+0

你的代码片段会抛出一个错误(string vs fixnum)看看Array.find:'hash.keys.find {| k | k.to_s.include? number.to_s}' – mestachs

+0

@准确。 – Luigi

回答

3

使用find

if result = hash.keys.find {|k| k.include? number} 
    #do some work 
end 
+0

在这种情况下,我如何获得钥匙?我需要能够使用在我的#do某个工作块 – Luigi

+0

中找到的密钥,现在它就在那里。 –

+0

啊,够简单了...谢谢,并且为混乱感到抱歉。 – Luigi

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

例如,如果number = 13然后kv == [ 2013, "one" ]在该块。如果没有找到,则kvnil,并且该块被跳过。

+0

+1我是一个使用字符串来查找子字符串的人。 –

+0

但我不喜欢看到'如果kv = ...'在所有这一切-1。那么,我只是发现一个潜在的麻烦点和维护问题,并会在代码审查中将其标记出来。 –

1

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

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