perché le funzioni non hanno tipi di ritorno parametrizzati, in quanto ha parametri di input?
-
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.
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);