Ваша v
переменная здесь на самом деле представляет собой массив слов .
Итак, когда вы говорите:
if /^*#{v.to_s}*/.match? str
, это на самом деле делает что-то вроде этого:
if /^*["apple", "cherry"]*/.match?(string)
Это не то, что вам нужно.
Если вы хотите увидеть, совпадают ли любые слов, вы можете использовать Array # any? :
list = {
"red" => ["apple", "cherry"],
"blue" => ["sky", "cloud"],
"white" => ["paper"]
}
str = "testString"
list.each do |key, words|
puts "string: #{str}"
puts "value: #{words}"
puts words.any? { |word| /^*#{word}*/.match? str.to_s }
end
, который печатает:
string: testString
value: ["apple", "cherry"]
false
string: testString
value: ["sky", "cloud"]
false
string: testString
value: ["paper"]
false
Обратите внимание, мне не совсем понятно, каков ожидаемый результат, но если вы хотите напечатать что-то отличное от true / false, вы можете сделать так, как:
if words.any? { |word| /^*#{word}*/.match? str.to_s }
puts "its a match"
else
puts "its not a match"
end