我有这段代码
if self.name.starts_with?('Bronze') || self.name.starts_with?('Silver') ||self.name.starts_with?('Gold')
有没有办法一次性传递所有这些字符串而不是大量的OR,因为我可能需要对此进行扩展?
答案 0 :(得分:21)
String#start_with?
接受任意数量的参数。您无需使用||
。
'Silver medal'.start_with?('Bronze', 'Silver', 'Gold')
# => true
'Hello medal'.start_with?('Bronze', 'Silver', 'Gold')
# => false
答案 1 :(得分:1)
不, start_with
采用字符串或正则表达式。
我发现不断扩大的正则表达式很烦人。
直到我发现自己是totally wrong as per @falsetru,我才这样做:
%w[Bronze Silver Gold].any? { |s| name.start_with? s }
我将这些单词数组放入变量或常量(或者我认为的方法)中。
然后,我将逻辑放入一个方法,无论它是name
属性,它的名称取决于上下文。这使得这个通常可测试,可扩展和封装。
def precious_metal?
self.name.starts_with? precious_metals
end
...
if precious_metal?
# Some logic
end