Рубиновый хэш только возвращает TRUE - PullRequest
0 голосов
/ 10 июня 2019

Если строка соответствует любому из значений, я хочу вывести значение

Код:

list = {
    "red" => ["apple", "cherry"],
    "blue" => ["sky", "cloud"],
    "white" => ["paper"]
}

str = "testString"

list.each do |k, v|
    puts "string: #{str}"
    puts "value: #{v}"
    puts /^*#{v}*/.match? str.to_s
end

Я ожидаю, что вывод ложен, потому что ничего не соответствует

но фактический результат все верно ..

string: testString
value: String
true
string: testString
value: String
true
string: testString
value: String
true

Если «testString» совпадает с любым из «Value»

как можно распечатать ключ значения?

Код ниже - мой неправильный код.

list.each do |k, v|
    puts "string: #{str}"
    puts "value: #{v}"
    if /^*#{v.to_s}*/.match? str
        puts "key of value is : #{k}"
    end
end

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Ваша 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
0 голосов
/ 10 июня 2019

Без регулярных выражений, поскольку значения являются массивами, вы можете сделать вложенный цикл:

list.each do |color, words| # loops through keys and values
    puts "\nLooking for #{str} in #{color}"
    words.each do |word| # loops through the elements of values
      found = (word == str)
      puts "\t- #{word} is #{found}"
    end
    found_any = words.include? str
    puts "\tFound any match? #{found_any}"
end

Который распечатывает

# Looking for apple in red
#   - apple is true
#   - cherry is false
#   Found any match? true
# 
# Looking for apple in blue
#   - sky is false
#   - cloud is false
#   Found any match? false
# 
# Looking for apple in white
#   - paper is false
#   Found any match? false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...