¿Por qué las funciones no tienen tipos de retorno parametrizados, ya que tiene una entrada parametrizada?

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Esto siempre nos obliga a devolver un único parámetro en caso de que necesite devolver múltiples, digamos una Lista y una Cadena. Esta restricción no existe en los argumentos de función.

¿Fue útil?

Solución

Este problema es el que intentan abordar los lenguajes funcionales como F #, haskell, etc. El problema es que en el hardware, el valor de retorno de una función se devolvió originalmente a través de un registro de CPU, por lo que solo puede devolver un valor único. La sintaxis C pasó a este legado y C ++ (y C #, Java) también heredaron esto.

Otros consejos

Si necesita hacer esto con suficiente frecuencia, cree una clase solo para contener el resultado y devolverlo en su lugar.

Esto también le permite DOCUMENTAR lo que devuelve su función de la misma manera que se documentan los parámetros.

De hecho, algunos idiomas hacen lo que quieres exactamente. Por ejemplo Python, mira este código. Devuelve 2 valores: 1 cadena y otro int.

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

Espero que ayude.

PD: Debajo de las cubiertas, supongo que Python lo está colocando en una lista y lo está desempaquetando. No conozco Python tan bien para decirte exactamente qué hace.

o, devuelve Object [] desde tu método y haz

return new Object[] { list, string};

Si necesita más tipos de retorno parametrizados, puede crear Pair < X, Y > clases, o Triplete < Z, Y, Z > y devolverlos.

Javascript, afortunadamente para ti, es un lenguaje dinámico. Esto significa que puede construir cualquier tipo de objeto que desee y devolverlo. Esto cumple efectivamente su requisito de tener un & Quot; parametrizado & Quot; valor de retorno, aunque de una manera bastante insegura.

Por ejemplo:

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

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

Una forma de manejar el comportamiento de retorno complejo es pasar una interfaz que el método llama. por ejemplo,

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top