2017-05-24 24 views
1

我试图找出case语句的方法来考虑从正则表达式传入的两个参数。如何使用传入参数的参数编写条件Ruby case语句?

我的正则表达式的例子是:

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

我有一个case声明,现在只说明角色类型,但我怎么也有案例部分帐户role_typerecord_type

我的目标是测试当记录类型为“新”或“更新”时角色A被定向到不同的端点集合,并且我希望角色B在传入“新建”时指向另一组端点“和”更新“。如果他们被传递到相同的端点,那么只有record_type的案例陈述就足够了。

我有现在的问题是:

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对使用哪个语句感到困惑。

回答

1

红宝石不是“糊涂”你刚才只有两种情况:

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

+0

这也行得通!我想我是一个迷茫的人。我一定会看到我可以做些什么来创建一个方法。谢谢! – qaminded

2

之间的相似性,则可能会对此进行更多重构。您无法将“参数”传递给casecase后的第一项是返回匹配对象的表达式,并且您放入的表达式返回truefalse。您可以将其全部放入if表达式中,也可以将这两个对象放在一个阵列中并匹配整个阵列:

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

这工作,谢谢你!现在我更清楚地知道&&运营商如何解决问题。 – qaminded