这个问题基于所有使用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...
这个问题基于所有使用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...
Python没有switch语句。推荐的替代方案是使用if/else链,这也是你应该在你的情况下使用的。
另一个常见的习惯用法是使用映射。在你的情况下,你可以使用一个(var1,var2)元组来匹配结果。
switch = {
(1,2): lambda: ..,
(3,4): lambda: ...,
}
switch[(var1,var2)]
我不确定这是常用的,但至少它是可能的。
是/否。
没有使用"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"
function 1 a = "second parameter is " ++ (show a)
现在,由于它通常是自上而下进行的(不像switch语句),因此更类似于if / else而不是switch语句,后者只会跳转到正确的位置。这只是一个非常漂亮的if / else。此外,如果我重新排列文件,使最一般的情况位于文件顶部,则其他情况将被忽略。
您还可以使用模板执行类似的操作,但这只能在编译时起作用。
describeList :: [a] -> String
describeList list =
case list of
[] -> "The list was empty"
(x:xs) -> "The list wasn't empty: the first element was " ++ show x ++
", and there were " ++ show (length xs) ++
" more elements in the list."
CHILL 允许它:
"PROC (b board LOC,m move) EXCEPTIONS (illegal);
DCL starting square LOC:= b (m.lin_1)(m.col_1),
arriving square LOC:= b (m.lin_2)(m.col_2);
DO WITH m;
IF starting.status=free THEN CAUSE illegal; FI;
IF arriving.status/=free THEN
IF arriving.p.kind=king THEN CAUSE illegal; FI;
FI;
CASE starting.p.kind, starting.p.color OF
(pawn),(white):
IF col_1 = col_2 AND (arriving.status/=free
OR NOT (lin_2=lin_1+1 OR lin_2=lin_1+2 AND lin_2=2))
OR (col_2=PRED (col_1) OR col_2=SUCC (col_1))
AND arriving.status=free THEN CAUSE illegal; FI;
IF arriving.status/=free THEN
IF arriving.p.color=white THEN CAUSE illegal; FI; FI;
(pawn),(black):
IF col_1=col_2 AND (arriving.status/=free
OR NOT (lin_2=lin_11 OR lin_2=lin_12 AND lin_1=7))
OR (col_2=PRED (col_1) OR col_2=SUCC (col_1))
AND arriving.status=free THEN CAUSE illegal; FI;
IF arriving.status/=free THEN
IF arriving.p.color=black THEN CAUSE illegal; FI; FI;
(rook),(*):
IF NOT ok_rook (b,m)
THEN CAUSE illegal;
FI;
(bishop),(*):
IF NOT ok_bishop (b,m)
THEN CAUSE illegal;
FI;
(queen),(*):
IF NOT ok_rook (b,m) AND NOT ok_bishop (b,m)
THEN CAUSE illegal;
你可以在Scala(以及任何其他带有模式匹配机制的函数式语言)中做类似于你想要的事情:
def matchTest(var1: Any, var2: Any): Any = (var1, var2) match {
case (a, _) => "var1 == a"
case (_, b) => "var2 == b"
case (0, 1) => "var1 == 0, var2 == 1"
}
let fnc (var1, var2) =
match (var1, var2) with
| 2 , _ -> "something"
| _ , 3 -> "something else"
| 0, 1 -> "etc ... "
| a, b -> "I got " + a.ToString() + " and " + b.ToString()
fnc(0, 1) |> printfn "%s" // prints "etc.."
在scala中同样如此
def fnc(var1: Int, var2: Int) : String =
(var1, var2) match {
case (2, _) => "something"
case ( _,3) => "something else"
case (0, 1) => "etc..."
case (a, b) => "I got " + a + " and " + b
}
println(fnc(0,1))
我从未见过允许那样做的语言。
如果你仔细想一下,编程语言是不允许这样的,因为你可能会得到多个正确的情况。