使用 || 的案例陈述(要么)

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 nilnil ||-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