如何编写一个条件 Ruby case 语句,并将参数传递到案例中



我试图找出一种方法,让case语句考虑从正则表达式传入的两个参数。

我的正则表达式示例是:

(/^(?:a|an|the) (RoleA|RoleB)尝试访问(New|Updated) Record$/)时,请执行|role_type, record_type|

我有一个case语句,现在只考虑角色类型,但我如何让案例部分也考虑role_typerecord_type

我的目标是测试当记录类型为"新建"或"已更新"时,角色 A 是否定向到一组不同的终结点,并且我希望在传入"新建"和"已更新"时将角色 B 定向到另一组终结点。如果它们被传递到相同的端点,那么仅针对record_type的 case 语句就足够了。

我现在拥有的是:

case record_type
   when 'New'
     <do something>
   when 'Updated'
     <do something>
 end

我想根据角色来切换行为。这不起作用:

case record_type && role_type == 'RoleA'
   when 'New'
     <do something>
   when 'Updated'
     <do something>
 end
case record_type && role_type == 'RoleB'
   when 'New'
     <do something>
   when 'Updated'
     <do something>
 end

跳过这段代码,我假设 Ruby 对使用哪个语句感到困惑。

您不能将"参数"传递给casecase 后面的第一个项是一个表达式,它返回它将匹配的对象,您输入的表达式返回 truefalse 。您可以将所有对象全部放在if表达式中,也可以将两个对象放在一个数组中并在整个数组上进行匹配:

case [record_type, role_type]
when ['New', 'RoleA']
  ...
when ['New', 'RoleB']
  ...
when ['Updated', 'RoleA']
  ...
when ['Updated', 'RoleB']
  ...
end

Ruby 并不"困惑",您只有 2 种情况:

case record_type && role_type == 'RoleA' # true or false 

因为record_type && role_type == 'RoleA'只会评估为真或假,我认为您正在寻找的更多是:

case role_type
  when 'RoleA'
    case record_type
       when 'New'
         #do something
       when 'Updated'
         #do something
    end
 when 'RoleB'
    case record_type
       when 'New'
         #do something
       when 'Updated'
         #do something
   end
end

话虽如此,我建议研究是否可以将其重构为更简单的东西,例如

def new_record(role_type)
  if role_type == 'RoleA'
    #do something
  elsif role_type == 'RoleB'
    #do something
  end 
end
def updated_record(role_type)
  if role_type == 'RoleA'
    #do something
  elsif role_type == 'RoleB'
    #do something
  end
end 
acceptable_record_types = ['New','Updated']
public_send("#{record_type.downcase}_record",role_type) if acceptable_record_types.include?(record_type)

如果我了解#do something之间的相似之处,则可以进一步重构

最新更新