por que funções não têm parametrizados tipos de retorno, já que tem entrada parametrizada?

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

  •  19-08-2019
  •  | 
  •  

Pergunta

Isso sempre nos força para retornar um único parâmetro no caso de eu precisar retornar múltipla, dizer uma lista e uma String. Esta restrição não é lá em argumentos da função.

Foi útil?

Solução

Este problema é o que linguagens funcionais como F #, Haskell etc. tentar endereço. O problema é que em hardware, valor de retorno de uma função foi originalmente retornou através de um registo CPU, assim você só poderia retornar um único valor. C sintaxe passou este legado e C ++ (e C #, Java) também herdou isso.

Outras dicas

Se você precisa fazer isso com freqüência suficiente, em seguida, criar uma classe apenas para segurar o resultado e voltar que em vez.

Isso também permite que você documentar o que seus função retorna da mesma forma que os parâmetros são documentados.

Na verdade, algumas linguagens de fazer o que você quer exatamente. Por exemplo Python, olhar para este código. Ele retorna 2 valores:. 1 string e outro int

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

Eu espero que ele iria ajudar.

PS: Nos bastidores, eu acho que Python é o boxe-lo em uma lista e un boxe-lo. Eu não sei Python que bem lhe dizer o que exatamente ele faz.

ou, o retorno Object [] a partir do seu método, e fazer

return new Object[] { list, string};

Se precisar de tipos de retorno mais parametrizadas, você pode criar pares classes, ou Triplet e retornar aqueles.

Javascript, felizmente para você, é uma linguagem dinâmica. Isto significa que você pode construir qualquer tipo de objeto que você deseja e devolvê-lo. Isso atende efetivamente sua exigência de ter um "parametrizados" valor de retorno, ainda que de forma bastante un-typesafe.

Por exemplo:

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

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

Em forma de lidar com o comportamento de retorno complexo é passar uma interface que as chamadas de método. por exemplo.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top