2011-03-25 19 views

Respuesta

4

Sí/No.

Ningún lenguaje tradicional con una instrucción "cambiar" tiene esto. Existe en algo llamado "coincidencia de patrones".

C#, Java, PHP y Python no son compatibles con la coincidencia de patrones (no estoy completamente seguro de PHP, pero no creo que lo haga. Corrígeme si me equivoco).

Aquí hay un ejemplo en Haskell donde existe la coincidencia de patrones. La coincidencia de patrones se encuentra en muchos lenguajes de estilo funcional.

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" 

Cuando esta función se llama, el tiempo de ejecución/compilador/el que comprueba que será ver si la primera función puede ser llamada. Si puede, devuelve ese valor. Luego continúa hasta que pueda encontrar una coincidencia que funcione para los parámetros dados. El "_" es solo una forma de decir, "cualquier cosa puede estar aquí, y realmente no me importa qué es, así que no vincule el valor con un nombre". Si me importaba el valor, que podía hacer:

function 1 a = "second parameter is " ++ (show a) 

Ahora, ya que por lo general va de arriba hacia abajo (a diferencia de la instrucción switch), esto es más parecido a un if/else de una sentencia switch que acaba salta a el lugar correcto Es un aspecto muy bonito si/else. Además, si lo reordenaba para que el caso más general estuviera en la parte superior del archivo, los otros casos serían ignorados.

También puede hacer algo similar con las plantillas, pero eso solo funcionará en tiempo de compilación.

0

Nunca he visto un lenguaje que permita eso, no.

+2

De hecho, es común que los lenguajes funcionales (F #, ML, Haskell) para tener una característica, como se ha señalado Mateo Willis : http://stackoverflow.com/questions/5436983/can-the-switch-statement-have-more-than-one-variable/5437014#5437014 – Gabe

0

Ciertamente no en C#. Utilizarías un patrón if/else if para pasar por condiciones como estas. No puedo hablar en otro idioma con autoridad pero estoy 99% seguro de que Java tampoco lo permite. Sin embargo, quién sabe lo que permiten esos tipos locos de PHP y Python ...

+2

Python ni siquiera tiene una instrucción switch. :( – Gabe

0

No. Deberá anidar la caja del interruptor para una variable dentro de cada caja del otro.

2

Creo que se puede hacer una coincidencia de casos arbitraria en algunos idiomas como Haskell y ML. Ver Haskell Pattern Matching. El objeto en cuestión sigue siendo un solo objeto, pero ese objeto puede ser una tupla que contiene un número arbitrario de objetos.

Un ejemplo dado en el enlace es:

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." 
+1

Puede hacer coincidencia de patrones en todos los parámetros de función (para que pueda hacer coincidir varios objetos). –

+0

Sí, pero técnicamente esto no es una instrucción switch (caso en haskell): p –

+1

La coincidencia de patrones en funciones es solo azúcar sintáctica para una declaración de caso. De cualquier manera, son más similares a if/else que las instrucciones switch. –

0

Si se piensa en ello, las lenguas no pueden permitir que debido a que podría terminar con más de un caso que pudiera ser verdad.

+0

Al menos en Java, tiene que colocar sentencias break en su caso para evitar el procesamiento de todos los casos. Por lo tanto, más de uno podría ser verdadero. –

+0

@Gilbert No estoy en desacuerdo contigo, pero ¿puedes dar un ejemplo donde más de un caso sería cierto? –

+0

Es difícil dar la respuesta en un comentario, ya que no puedo formatearlo, pero el Java más simple ejemplo que puedo pensar es código int = 0; cambiar (código) {caso 0: código = 1; caso 1: código = 2; caso 2: System.out.println ("Este fue un ejemplo tonto");} . Hay un mejor exa Mple alrededor de la mitad de la página aquí: http://download.oracle.com/javase/tutorial/java/nutsandbolts/switch.html –

0

AFAIK, python no tiene la caja del interruptor.

5

Python no tiene una instrucción de conmutación. La alternativa recomendada es utilizar una cadena if/else encadenada, que es lo que debería utilizar en su caso de todos modos.

Otra expresión común es el uso de un mapa. Y en su caso, podría usar una tupla de (var1, var2) para hacer coincidir los resultados.

switch = { 
    (1,2): lambda: .., 
    (3,4): lambda: ..., 
} 
switch[(var1,var2)] 

No estoy seguro de que esto se use comúnmente, pero al menos es posible.

+2

La "alternativa recomendada" para una instrucción switch en Python es un diccionario que creo. – Voo

+1

+1 ¡GUAU, muy bonito! –

2

CHILL lo permite:

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; 
2

Se podía hacer algo similares a lo que quiere en Scala (y cualquier otro lenguaje funcional, con un mecanismo de reconocimiento de patrones):

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" 
} 
2

Como se dijo, esta coincidencia de patrones es típica de los lenguajes funcionales. Pero puede encontrar algunos funcionales/OOP "híbridos" que lo admitan.

He aquí un ejemplo en Fa #

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.." 

y lo mismo en 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)) 
+0

Esto es elegante .. Y F # un poco más que Scala ... – nawfal

Cuestiones relacionadas