perché le funzioni non hanno tipi di ritorno parametrizzati, in quanto ha parametri di input?

StackOverflow https://stackoverflow.com/questions/472129

  •  19-08-2019
  •  | 
  •  

Domanda

Questo ci costringe sempre a restituire un singolo parametro nel caso in cui ho bisogno di restituire più, ad esempio un elenco e una stringa. Questa restrizione non è presente negli argomenti delle funzioni.

È stato utile?

Soluzione

Questo problema è quello che i linguaggi funzionali come F #, haskell ecc. tentano di risolvere. Il problema è che nell'hardware il valore restituito di una funzione è stato originariamente restituito tramite un registro CPU, quindi è possibile restituire un solo valore. La sintassi C trasmessa su questa eredità e C ++ (e C #, Java) hanno ereditato anche questo.

Altri suggerimenti

Se devi farlo abbastanza frequentemente, crea una classe solo per contenere il risultato e restituirlo invece.

Ciò consente anche di DOCUMENTARE ciò che la funzione restituisce nello stesso modo in cui i parametri sono documentati.

In effetti, alcune lingue fanno esattamente quello che vuoi. Ad esempio Python, guarda questo codice. Restituisce 2 valori: 1 stringa e un altro int.

>>> def myFunc():
...   string_val = "techmaddy"
...   int_val = 10
...   return string_val, int_val
...
>>>
>>> s, i = myFunc()
>>>
>>> print s
techmaddy
>>>
>>> print i
10

Spero che possa aiutare.

PS: credo che Python lo stia inscatolando in un elenco e lo stacchi. Non conosco bene Python per dirti esattamente cosa fa.

oppure, restituisci Object [] dal tuo metodo e fai

return new Object[] { list, string};

Se hai bisogno di più tipi restituiti parametrizzati, puoi creare Pair < X, Y > classi o Tripletta < Z, Y, Z > e restituiscili.

Javascript, fortunatamente per te, è un linguaggio dinamico. Ciò significa che puoi costruire qualsiasi tipo di oggetto desiderato e restituirlo. Questo soddisfa efficacemente il tuo requisito di avere un & Quot; & Quot parametrizzato; restituisce valore, anche se in un modo non tipicamente sicuro.

Ad esempio:

function stuff() {
    return {
        "foo": "a",
        "bar": "b"
    }
}

var theStuff = stuff();
alert(theStuff.foo + theStuff.bar); // should output "ab"

Sul modo di gestire un comportamento di ritorno complesso è passare un'interfaccia chiamata dal metodo. per es.

public interface Results<R> {
    public void processing(String stage);
    public void success(String mesg, R result);
    public void successes(String mesg, List<R> result);
    public void thrown(Throwable t);
}

public void process(Results<R> results, String text, List<String> data);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top