case search_term
when 'a'
ptr = 0
when 'b'
ptr = 1
when 'c'
ptr = 2
else
ptr = 99
end
if location = 'xyz' and search_term = 'c'
ptr = 0
end
有什么办法可以包括如果上面的情况说明?有反正我可以使用,如果其他内部红宝石case..end
case search_term
when 'a'
ptr = 0
when 'b'
ptr = 1
when 'c'
ptr = 2
else
ptr = 99
end
if location = 'xyz' and search_term = 'c'
ptr = 0
end
有什么办法可以包括如果上面的情况说明?有反正我可以使用,如果其他内部红宝石case..end
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
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
您可以使用三元运算符的时候,子句中:
case search_term
when 'a'
ptr = 0
when 'b'
ptr = 1
when 'c'
ptr = location == 'xyz' ? 0 : 2
else
ptr = 99
end
两个备注:
==
比较(=
是一个赋值)这将是另一种可能性:
ptr = (location == 'xyz') ? 0 : 2
括号不是必需的,但我发现它更具可读性。
如果我写它简洁地我会用:是不是真的建议
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
或有没有很多键/值对被合并。通常我会用第一种风格来定义它。
这不会产生与OP逻辑相同的结果。如果'location =='xyz''这会导致'ptr'没有被设置为任何东西。 – moveson
@moveson你是对的,只是错过了完整的逻辑。我修改了代码。 – knut