2013-12-17 3 views
2

У меня есть хэш следующим образом:рубин, если хэш-ключи включают текст, возвращать хэш ключа

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

и переменной number:

number = 13

мне нужно искать через все мои хэш-ключи, и если number включен в ключ, мне нужно вернуть этот ключ. Сейчас у меня есть это:

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

Это работает, но я на самом деле нужно, чтобы вернуть k в том случае, k действительно включает 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" ] в блоке. Если не найден, то kv - nil, и блок пропускается.

+0

+1 Я - присоска для использования '[...]' со строками, чтобы найти подстроки. –

+0

Но мне не нравится видеть 'if kv = ...' вообще так -1. Нет, я просто нахожу, что это проблема проблем и проблем с обслуживанием и будет отмечать ее в обзоре кода. –

1

Вы хотите преобразовать оба значения в строки, а затем просто проверить, содержит ли одна строка другую. Что-то вроде этого:

hash.keys.select {|key| key.to_s.include? number.to_s } 
Смежные вопросы