我正在创建一个外卖餐厅数据库,每个商店的Managers
都可以访问该数据库。其中一个数据库表称为Product
,它具有一列称为product_name
。 product_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
答案 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