2013-12-17 54 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 }