检查字符串数组中的值

时间:2019-03-16 12:24:32

标签: ruby

我正在创建一个外卖餐厅数据库,每个商店的Managers都可以访问该数据库。其中一个数据库表称为Product,它具有一列称为product_nameproduct_name是一个包含多个单词的字符串。我正在尝试检查product_name是否包含肉,然后告诉用户它是否适合素食者。

这是我的代码。我试图创建一个meats数组,并对照它检查product_name。我认为if not语句不正确。

class Checkveg
  def self.runcheck(product_name)
    meats = ["lamb", "beef", "pork", "prawn", "chicken", "fish"]
    meats.each { |item|
      if product_name.include? item
        puts "Not suitable for vegans or vegetarians"
      end
    }
    puts "Suitable for vegans or vegetarians" if not meats.include? product_name
  end
end

**更新:

我能够解决

noVeg = false
meats = ["lamb", "beef", "pork", "prawn", "chicken", "fish"]
meats.any? { |item|
  if product_name.include? item
    noVeg = true
    break
  end
}
if noVeg == true
  puts "Not suitable for vegetarians"
else
  puts "Suitable for vegetarians"
end

3 个答案:

答案 0 :(得分:2)

您没有正确使用any?方法。您应该这样使用它的返回值:

#!/usr/bin/env ruby

meats = ["lamb", "beef", "pork", "prawn", "chicken", "fish"]

product_name = "Beef curry"

noVeg = meats.any? do |item|
    product_name.downcase.include? item
end

if noVeg == true
    puts "Not suitable for vegetarians"
else
    puts "Suitable for vegetarians"
end

我还添加了downcase,因为在上面的评论中,您用大写的b写了牛肉。

答案 1 :(得分:2)

我建议,首先从产品名称中提取单词。我将good example by Cary Swoveland中的正则表达式用于此方法。但是,您可以使用最适合您的正则表达式:

product_name = "Chicken_Wings 1"
product_words = product_name.scan(/[[:alpha:]](?:(?:[[:alpha:]]|\d|')*[[:alpha:]])?/x).map(&:downcase)

#=> ["chicken", "wings"]

然后检查product_words数组中是否不包含meats

no_veg = product_words.none? { |w| meats.include? w }
#=> false

在这种情况下,product_name = "Carrots and onions"no_veg = true

答案 2 :(得分:2)

另一种选择是使用meats数组创建一个正则表达式。

meats_regex_string = meats.map(&Regexp.method(:escape)).join('|')
meats_regex = Regexp.new(meats_regex_string)
# or /#{meats_regex_string}/
product_name.match?(meats_regex)

如果您知道您的字符串中不包含任何正则表达式特殊字符,例如.map(&Regexp.method(:escape))(*?,则可以省略|,等

如果您不关心字符大小写,请使用:

meats_regex = Regexp.new(meats_regex_string, Regexp::IGNORECASE)
# or /#{meats_regex_string}/i