2016-11-10 37 views

回答

4
ptr = case search_term 
when 'a' 
    0 
when 'b' 
    1 
when 'c' 
    if location == 'xyz' then #note the == 
    0 
    else 
    2 
    end 
else 
    99 
end 
2

case构造通常不用于复杂逻辑。虽然你可以找到一个可行的解决方案(比如@steenslag的答案),但随着条件变得更加复杂,这条路径会导致麻烦。一个case声明与三个或四个分支是可行的,但已经有点代码味道。不止这成为问题。将条件放入when分支会使问题复杂化。

你可能会考虑使用小方法将事情分解成单独的职责。这将使您的代码在未来更易于理解,扩展和修改。

def pointer # Ruby convention is to use real words where practical 
    special_condition? ? 0 : pointer_base 
end 

def special_condition? 
    location == 'xyz' && search_term == 'c' 
end 

def pointer_base 
    search_term_map[search_term] || 99 
end 

def search_term_map 
    ('a'..'c').zip(0..2).to_h # This could just as easily be ('a'..'z').zip(0..25).to_h 
end 
0

您可以使用三元运算符的时候,子句中:

case search_term 
when 'a' 
    ptr = 0 
when 'b' 
    ptr = 1 
when 'c' 
    ptr = location == 'xyz' ? 0 : 2 
else 
    ptr = 99 
end 

两个备注:

  • ==比较(=是一个赋值)
+2

这不会产生与OP逻辑相同的结果。如果'location =='xyz''这会导致'ptr'没有被设置为任何东西。 – moveson

+0

@moveson你是对的,只是错过了完整的逻辑。我修改了代码。 – knut

0

这将是另一种可能性:

ptr = (location == 'xyz') ? 0 : 2 

括号不是必需的,但我发现它更具可读性。

0

如果我写它简洁地我会用:是不是真的建议

ptr = case search_term 
     when 'a' 
     0 
     when 'b' 
     1 
     when 'c' 
     location == 'xyz' ? 0 : 2 
     else 
     99 
     end 

三元陈述尽管许多语言允许他们,主要是因为太多的人不知道如何使用它们,或安全/可维护地使用它们。

或者它可以写成:

ptr = case search_term 
     when 'a' 
     0 
     when 'b' 
     1 
     when 'c' 
     if location == 'xyz' 
      0 
     else 
      2 
     end 
     else 
     99 
     end 

如果你真的想要得到乐趣,你可以利用Hash.new的恢复默认值的功能:

​​

测试他们:

search_term = 'a' 
location = 'xyz' 

ptr = case search_term 
     when 'a' 
     0 
     when 'b' 
     1 
     when 'c' 
     if location == 'xyz' 
      0 
     else 
      2 
     end 
     else 
     99 
     end 
ptr # => 0 

Hash.new(99).merge(
    'a' => 0, 
    'b' => 1, 
    'c' => location == 'xyz' ? 0 : 2 
)[search_term] # => 0 

search_term = 'b' 
location = 'xyz' 

ptr = case search_term 
     when 'a' 
     0 
     when 'b' 
     1 
     when 'c' 
     if location == 'xyz' 
      0 
     else 
      2 
     end 
     else 
     99 
     end 
ptr # => 1 

Hash.new(99).merge(
    'a' => 0, 
    'b' => 1, 
    'c' => location == 'xyz' ? 0 : 2 
)[search_term] # => 1 

search_term = 'c' 
location = 'xyz' 

ptr = case search_term 
     when 'a' 
     0 
     when 'b' 
     1 
     when 'c' 
     if location == 'xyz' 
      0 
     else 
      2 
     end 
     else 
     99 
     end 
ptr # => 0 

Hash.new(99).merge(
    'a' => 0, 
    'b' => 1, 
    'c' => location == 'xyz' ? 0 : 2 
)[search_term] # => 0 

search_term = 'c' 
location = 'abc' 

ptr = case search_term 
     when 'a' 
     0 
     when 'b' 
     1 
     when 'c' 
     if location == 'xyz' 
      0 
     else 
      2 
     end 
     else 
     99 
     end 
ptr # => 2 

Hash.new(99).merge(
    'a' => 0, 
    'b' => 1, 
    'c' => location == 'xyz' ? 0 : 2 
)[search_term] # => 2 

search_term = 'z' 
location = 'xyz' 

ptr = case search_term 
     when 'a' 
     0 
     when 'b' 
     1 
     when 'c' 
     if location == 'xyz' 
      0 
     else 
      2 
     end 
     else 
     99 
     end 
ptr # => 99 

Hash.new(99).merge(
    'a' => 0, 
    'b' => 1, 
    'c' => location == 'xyz' ? 0 : 2 
)[search_term] # => 99 

定义散列上飞是OK,如果你在不长的循环或迭代很多值的search_term或有没有很多键/值对被合并。通常我会用第一种风格来定义它。