案例陈述使用|| (OR)

时间:2015-06-05 16:06:17

标签: ruby hash case

以下代码我尝试通过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个别名的10个语句。有没有一种方法可以使这个case语句使用哈希,以便让系统确定它何时匹配指定的site_id?或其他方式使这些或功能发挥作用?

4 个答案:

答案 0 :(得分:2)

你可以写:

@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

答案 1 :(得分:2)

不要给你正确的方法,因为其他人已经这样做了,但是你知道原始代码失败的原因会很好。

case @site_id
  when /site1/ || /site2/ ...

不会转化为:

if @site_id =~ /site1/ || @site_id =~ /site2/ ...

但是:

if @site_id =~ /site1/ || /site2/ ...

解析为:

if ((@site_id =~ /site1/) || /site2/) ...

所以,当第一场比赛失败时,它会返回nilnil || -ed与正则表达式对象具有正则表达式对象本身的值。条件中的正则表达式对象的布尔值为......您猜测:false

你甚至会得到一个:

  

警告:条件中的正则表达式文字

如果你直接在if语句中这样做。

答案 2 :(得分:1)

您可能更愿意写:

@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

答案 3 :(得分:0)

你可以加入你的正则表达式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/那样使用正则表达式,这就是联盟在这里基本上会为你做的。