使用 || 的案例陈述(要么)
Case Statement using || (OR)
我试图使用以下代码通过 api 向我们的票务系统分配电子邮件别名。
@email.cc_list = case @site_id
when /site1/ || /site2/; "smail-alias-1"
when /site3/ || /site4/ || /site5/ || /site6/; "email-alias-2"
when /site7/ || /site8/; "email-alias-3"
when /site9/; "email-alias-4"
when /site10/; "email-alias-5"
end
问题是实际上只有站点 1、3、7、9 和 10 被正确分配。 || 之后的任何内容不工作。
我宁愿避免 10 个 when 语句用于 5 个别名。有没有办法让这个 case 语句与散列一起工作,以便让系统确定它何时匹配指定的 site_id?或使 or 函数起作用的其他方法?
你可以这样写:
@email.cc_list = case @site_id
when /site(1|2)/ then "smail-alias-1"
when /site(3|4|5|6)/ then "email-alias-2"
when /site(7|8)/ then "email-alias-3"
when /site9/ then "email-alias-4"
when /site10/ then "email-alias-5"
end
您可以使用 Regexp.union:
加入您的正则表达式
@email.cc_list = case @site_id
when Regexp.union(/site1/, /site2/); "smail-alias-1"
when Regexp.union(/site3/, /site4/, /site5/, /site6/); "email-alias-2"
when Regexp.union(/site7/, /site8/); "email-alias-3"
when /site9/; "email-alias-4"
when /site10/; "email-alias-5"
end
或者自己制作像 /site1|site2/
这样的正则表达式,这就是 union 在这里基本上可以为您做的。
不是为了给你正确的方法,因为其他人已经这样做了,但有助于你了解你的原始代码失败的原因。
case @site_id
when /site1/ || /site2/ ...
不转换为:
if @site_id =~ /site1/ || @site_id =~ /site2/ ...
但是为了:
if @site_id =~ /site1/ || /site2/ ...
解析为:
if ((@site_id =~ /site1/) || /site2/) ...
因此,当第一个匹配失败时,它 returns nil
。 nil
||-ed with a regex object 具有 regex object 本身的值。条件中的正则表达式对象的布尔值为...你猜:false
你甚至会得到:
warning: regex literal in condition
如果您直接在 if 语句中执行。
您可能更喜欢写:
@email.cc_list = case @site_id[/\d+/].to_i
when 1,2 then "smail-alias-1"
when 3..6 then "email-alias-2"
when 7,8 then "email-alias-3"
when 9 then "email-alias-4"
when 10 then "email-alias-5"
end
我试图使用以下代码通过 api 向我们的票务系统分配电子邮件别名。
@email.cc_list = case @site_id
when /site1/ || /site2/; "smail-alias-1"
when /site3/ || /site4/ || /site5/ || /site6/; "email-alias-2"
when /site7/ || /site8/; "email-alias-3"
when /site9/; "email-alias-4"
when /site10/; "email-alias-5"
end
问题是实际上只有站点 1、3、7、9 和 10 被正确分配。 || 之后的任何内容不工作。
我宁愿避免 10 个 when 语句用于 5 个别名。有没有办法让这个 case 语句与散列一起工作,以便让系统确定它何时匹配指定的 site_id?或使 or 函数起作用的其他方法?
你可以这样写:
@email.cc_list = case @site_id
when /site(1|2)/ then "smail-alias-1"
when /site(3|4|5|6)/ then "email-alias-2"
when /site(7|8)/ then "email-alias-3"
when /site9/ then "email-alias-4"
when /site10/ then "email-alias-5"
end
您可以使用 Regexp.union:
加入您的正则表达式@email.cc_list = case @site_id
when Regexp.union(/site1/, /site2/); "smail-alias-1"
when Regexp.union(/site3/, /site4/, /site5/, /site6/); "email-alias-2"
when Regexp.union(/site7/, /site8/); "email-alias-3"
when /site9/; "email-alias-4"
when /site10/; "email-alias-5"
end
或者自己制作像 /site1|site2/
这样的正则表达式,这就是 union 在这里基本上可以为您做的。
不是为了给你正确的方法,因为其他人已经这样做了,但有助于你了解你的原始代码失败的原因。
case @site_id
when /site1/ || /site2/ ...
不转换为:
if @site_id =~ /site1/ || @site_id =~ /site2/ ...
但是为了:
if @site_id =~ /site1/ || /site2/ ...
解析为:
if ((@site_id =~ /site1/) || /site2/) ...
因此,当第一个匹配失败时,它 returns nil
。 nil
||-ed with a regex object 具有 regex object 本身的值。条件中的正则表达式对象的布尔值为...你猜:false
你甚至会得到:
warning: regex literal in condition
如果您直接在 if 语句中执行。
您可能更喜欢写:
@email.cc_list = case @site_id[/\d+/].to_i
when 1,2 then "smail-alias-1"
when 3..6 then "email-alias-2"
when 7,8 then "email-alias-3"
when 9 then "email-alias-4"
when 10 then "email-alias-5"
end