如何编写条件 Ruby case 语句并将参数传递到 case 中?

How do I write a conditional Ruby case statement with parameters passed into the case?

我正在尝试为 case 语句找出一种方法来考虑从正则表达式传入的两个参数。

我的正则表达式示例是:

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

我有一个 case 声明,现在只说明角色类型,但我如何让案例部分也说明 role_typerecord_type

我的目标是测试当记录类型为 "New" 或 "Updated" 时角色 A 是否定向到另一组端点,并且我希望角色 B 定向到另一组端点当传入 "New" 和 "Updated" 时。如果它们被传递到相同的端点,那么 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 对使用哪个语句感到困惑。

Ruby 不是 "confused" 你只有 2 个案例:

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

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

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

之间的相似之处,可以进一步重构

您不能将 "argument" 传递给 casecase 之后的第一项是 returns 它将匹配的对象的表达式,以及您在 returns 中输入的表达式 truefalse。您可以将它们全部放在 if 表达式中,或者将两个对象放在一个数组中并匹配整个数组:

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