在Elixir中,如果我想检查多个布尔条件,而不是一些丑陋的if/else逻辑,我可以优雅地这样做:
guess = 46
number_of_guesses = 3
cond do
number_of_guesses > 5 ->
IO.puts "Too many guesses! You lose."
guess == 46 ->
IO.puts "You guessed 46!"
guess == 42 ->
IO.puts "You guessed 42!"
true ->
IO.puts "I give up."
end
上面的程序生成以下结果−
你猜的是46!
(示例派生自tutorialpoint,但进一步演示了并非每个表达式都必须包含相同的变量)
c#有类似的东西吗?还是我需要使用if/else?
如果您在几乎所有情况下都匹配一个值,您仍然可以使用带有大小写保护的switch表达式:
int guess = 46;
int numberOfGuesses = 3;
Console.WriteLine(
guess switch {
_ when numberOfGuesses > 5 => "Too many guesses! You lose.",
46 => "You guessed 46!",
42 => "You guessed 42!",
_ => "I give up."
}
);
请注意,在第一支中,我匹配了任何内容(下划线_
模式),但只有当numberofguess>5"。在这种情况下,你甚至可以做更花哨的模式匹配:
Console.WriteLine(
(guess, numberOfGuesses) switch
{
(_, > 5) => "Too many guesses! You lose.",
(46, _) => "You guessed 46!",
(42, _) => "You guessed 42!",
_ => "I give up."
}
);
当然,这不是在所有情况下都可能的。
如果所有的臂都是不相关的条件,使用这种_ when ...
结构感觉有点滥用,因此,您可以使用三元操作符链:
var x =
condition1 ?
someValue1 :
condition2 ?
someValue2 :
condition3 ?
someValue3 :
valueWhenNoConditionsAreTrue;
虽然我觉得即使这第一眼也会有点惊讶。
如果你想在这些分支中执行语句,而不是表达式,那么你应该使用普通的If -else- If结构,或者如果可以使用模式匹配,则使用switch语句(但注意_ when ...
技巧不能在switch语句中使用)。