switch语句可以有多个变量吗?

Bar*_*ski 6 php c# python java switch-statement

问题基于所有使用switch块的语言(C++,C#PHP,Java,Python等).那么有可能有这样的东西吗?

switch (var1, var2)
case  var1 = a:
    something
    break;
case var2 = b:
    something
    break;
case var1 = 0 ,var2 = 1
     etc...
Run Code Online (Sandbox Code Playgroud)

mar*_*rio 5

Python没有switch语句.建议的替代方案是使用链式if/else链 - 无论如何你应该在你的情况下使用它.

另一个常见的习语是使用地图.在您的情况下,您可以使用(var1,var2)元组来匹配结果.

switch = {
   (1,2): lambda: ..,
   (3,4): lambda: ...,
}
switch[(var1,var2)]
Run Code Online (Sandbox Code Playgroud)

我不确定这是常用的,但至少它是可能的.

  • Python中的switch语句的"推荐替代方案"是我认为的字典. (2认同)

Jon*_*erg 4

是/否。

没有带有“switch”语句的传统语言具有此功能。它确实存在于所谓的“模式匹配”中。

C#、Java、PHP 和 Python 不支持模式匹配(不完全确定 PHP 的情况,但我不相信它支持。如果我错了,请纠正我)。

这是 Haskell 中确实存在模式匹配的示例。模式匹配存在于许多函数式语言中。

function 1 _ = "first parameter has a one"
function _ 1 = "second parameter is a one"
function _ _ = "I don't know what crazy number you passed in"
Run Code Online (Sandbox Code Playgroud)

当调用该函数时,运行时/编译器/任何检查它的人都会查看是否可以调用第一个函数。如果可以,它会返回该值。然后它继续下去,直到找到适合给定参数的匹配项。“_”只是一种表达方式,“任何东西都可以在这里,我真的不在乎它是什么,所以不要将值绑定到名称”。如果我关心价值,我可以这样做:

function 1 a = "second parameter is " ++ (show a)
Run Code Online (Sandbox Code Playgroud)

现在,由于它通常是自上而下的(与 switch 语句不同),因此这更类似于 if/else,而不是仅跳转到正确位置的 switch 语句。这只是一个非常漂亮的 if/else。另外,如果我重新排序,使最常见的情况位于文件顶部,则其他情况将被忽略。

您也可以使用模板执行类似的操作,但这仅在编译时有效。