如何编写条件 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_type
和 record_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" 传递给 case
。 case
之后的第一项是 returns 它将匹配的对象的表达式,以及您在 returns 中输入的表达式 true
或 false
。您可以将它们全部放在 if
表达式中,或者将两个对象放在一个数组中并匹配整个数组:
case [record_type, role_type]
when ['New', 'RoleA']
...
when ['New', 'RoleB']
...
when ['Updated', 'RoleA']
...
when ['Updated', 'RoleB']
...
end
我正在尝试为 case
语句找出一种方法来考虑从正则表达式传入的两个参数。
我的正则表达式示例是:
当 (/^(?:a|an|the) (RoleA|RoleB)
尝试访问 (New|Updated) Record$/)
时执行 |role_type, record_type|
.
我有一个 case
声明,现在只说明角色类型,但我如何让案例部分也说明 role_type
和 record_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" 传递给 case
。 case
之后的第一项是 returns 它将匹配的对象的表达式,以及您在 returns 中输入的表达式 true
或 false
。您可以将它们全部放在 if
表达式中,或者将两个对象放在一个数组中并匹配整个数组:
case [record_type, role_type]
when ['New', 'RoleA']
...
when ['New', 'RoleB']
...
when ['Updated', 'RoleA']
...
when ['Updated', 'RoleB']
...
end