Perché le istruzioni switch con nome non sono un linguaggio? [chiuso]

-4

Potrei immaginare che il codice seguente sia in qualche modo utile. C'è una ragione per cui questo schema non è stato introdotto nei linguaggi di programmazione?

Per essere chiari, la stringa è stata proprio ciò che ho scelto come esempio da sostituire con qualsiasi tipo di input e la mia domanda sarebbe comunque valida.

public string switch findLastName(string firstName)
{
    case "John":
        return "Johnson";
    case "Susan":
        return "Stevens";
    case "Tyler":
        return "Gomez";
    default:
        return "Smith";
}

Invece di:

public string findLastName(string firstName)
{
    switch(firstName)
    {
        case "John":
            return "Johnson";
        case "Susan":
            return "Stevens";
        case "Tyler":
            return "Gomez";
        default:
            return "Smith";
    }
}
    
posta Jack Fraser 23.10.2015 - 22:07
fonte

4 risposte

7

Fondamentalmente non è in nessuna lingua perché non ti dà molto più di una funzione; il modo standard per creare un "pezzo" riutilizzabile di codice. Ad esempio il tuo esempio può essere creato facilmente come segue

public string findId(string firstName) {
    switch(firstname) {
        case "John": return "Johnson"; 
        case "Susan": return "Stevens"; 
        case "Tyler": return "Gomez"; 
        default: return "Smith";
    }
}

(Questo particolare uso di un'istruzione switch probabilmente non è una buona idea, ma capisco che questo è solo un esempio)

Se vogliamo supportare le istruzioni switch nominate dovremmo supportare anche named while e for loops, named if statements ecc. Tutti questi possono essere facilmente implementati già come funzioni ma in un modo molto più flessibile

    
risposta data 23.10.2015 - 22:46
fonte
4

Intendi un interruttore di stringa?

La maggior parte dei costrutti di linguaggio traduce direttamente in alcune istruzioni.

Tuttavia decidere quale stringa corrisponde a una data è più complicato. Il metodo più semplice è provarli uno per uno. Il modo più complicato e con maggiore dispendio di memoria, ma più veloce, è utilizzare un prefisso trie o hashmap (o hashtable) da cui puoi ottenere un numero intero che puoi attivare. Tuttavia ci sono diverse implementazioni di entrambe e diverse funzioni di hash, ognuna con i propri trade-off; forzare un'implementazione dipendente dal programmatore non sarà una cosa buona ™.

O vuoi dire mappare una stringa (o qualsiasi altro oggetto) ad un altro valore?

Risolto usando (di nuovo) un prefisso trie o hashmap (o hashtable) .

Per quanto riguarda il motivo per cui quel tipo di mappatura non è costruito in ...

È una singola riga di codice che si salva per un linguaggio che francamente non è così comune. Non vale la pena preoccuparsi.

    
risposta data 23.10.2015 - 22:32
fonte
4

Molte lingue supportano un costrutto chiamato pattern matching, e questo può essere usato come un'approssimazione abbastanza vicina a quello che stai facendo lì. Ad esempio, in Haskell (e gli esperti di Haskell dovranno perdonare la mia sintassi, perché è passato un po 'di tempo da quando ho lavorato su di esso) il tuo codice si presenta così:

findLastName :: string -> string
findLastName "John" = "Johnson"      
findLastName "Susan" = "Stevens"
findLastName "Tyler" = "Gomez"
findLastName x = "Smith"
    
risposta data 24.10.2015 - 09:35
fonte
0

Non è nel linguaggio C. Uno dei motivi è che in C, i casi switch vengono confrontati per l'uguaglianza e le stringhe sono puntatori, quindi, a meno che non introduciate regole strane, le stringhe verrebbero confrontate con il confronto tra puntatori che sarebbe assolutamente inutile ("John" == "John" can essere vero o falso in C, a seconda dell'implementazione).

Per un solo esempio di un'istruzione switch / case molto più potente, puoi scaricare il libretto di Swift; ci sono molte altre lingue con caratteristiche simili. Quindi la tua supposizione che questo non sia entrato nei linguaggi di programmazione è totalmente sbagliata.

    
risposta data 24.10.2015 - 14:32
fonte