我试图找出一种方法,让case
语句考虑从正则表达式传入的两个参数。
我的正则表达式示例是:
当(/^(?:a|an|the) (RoleA|RoleB)
尝试访问(New|Updated) Record$/)
时,请执行|role_type, record_type|
。
我有一个case
语句,现在只考虑角色类型,但我如何让案例部分也考虑role_type
和record_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 对使用哪个语句感到困惑。
您不能将"参数"传递给case
。case
后面的第一个项是一个表达式,它返回它将匹配的对象,您输入的表达式返回 true
或 false
。您可以将所有对象全部放在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
之间的相似之处,则可以进一步重构