Сначала предположим, что вы знаете, что word
заканчивается (как минимум) одним из ключей ending_hash
. Затем вы можете написать:
word = "Test"
ending_hash = {"e" => 1, "st" => 2}
ending_hash.find { |k,v| word.end_with?(k) }.last
#=> 2
См. Enumerable # find , Строка # end_with? и Массив # последний .
Промежуточный расчет выглядит следующим образом:
ending_hash.find { |k,v| word.end_with?(k) }
#=> ["st", 2]
Если вы не уверены, могут ли совпадать любые клавиш в конце строки напишите:
ending_hash = {"e" => 1, "f" => 2}
arr = ending_hash.find { |k,v| word.end_with?(k) }
#=> nil
arr.nil? ? nil : arr.last
#=> nil
или лучше:
ending_hash.find { |k,v| word.end_with?(k) }&.last
#=> nil
Здесь &
- это Оператор безопасной навигации . В двух словах, если выражение, предшествующее &
, возвращает nil
, SNO немедленно возвращает nil
для всего выражения без выполнения last
.
, даже если word
должен заканчиваться одним из ключи, вы можете написать это таким образом, чтобы вы могли проверить возвращаемое значение и вызвать исключение, если оно nil
.
Вы можете альтернативно написать:
ending_hash.find { |k,v| word.match? /#{k}\z/ }&.last
Регулярное выражение гласит: «соответствует значение из k
(#{k}
) в конце строки (якорь \z
)».
Обратите внимание на следующее:
{"t"=>1, "st"=>2}.find { |k,v| word.end_with?(k) }&.last
#=> 1
{"st"=>1, "t"=>2}.find { |k,v| word.end_with?(k) }&.last
#=> 1
, поэтому порядок ключей может иметь значение.
Наконец, поскольку блочная переменная v
не используется в расчете блока, переменные блока часто записываются |k,_|
или |k,_v|
, главным образом, чтобы сообщить читателю, что только k
используется в расчете блока.