パラメータ化された入力があるのに、関数がパラメータ化された戻り値の型を持たないのはなぜですか?

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

  •  19-08-2019
  •  | 
  •  

質問

これにより、リストや文字列など、複数のパラメーターを返す必要がある場合に備えて、常に1つのパラメーターが返されます。この制限は関数の引数にはありません。

役に立ちましたか?

解決

この問題は、F#、haskellなどの関数型言語が対処しようとするものです。問題は、ハードウェアでは、関数の戻り値が元々CPUレジスタを介して返されるため、単一の値しか返せないことです。このレガシーで渡されるC構文とC ++(およびC#、Java)もこれを継承しました。

他のヒント

これを頻繁に行う必要がある場合は、結果を保持するクラスを作成し、代わりにそれを返します。

これにより、パラメータが文書化されるのと同じ方法で、関数が返すものをドキュメント化することもできます。

実際、一部の言語は、まさにあなたが望むことをします。たとえばPythonの場合、このコードを見てください。 1つの文字列と別のintの2つの値を返します。

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

お役に立てば幸いです。

PS:カバーの下では、Pythonがリストにボックス化して、ボックス化を解除していると思います。正確に何をするのかを教えてくれるPythonをよく知りません。

または、メソッドからObject []を返し、実行します

return new Object[] { list, string};

パラメータ化された戻り値の型がさらに必要な場合は、Pair <!> lt; X、Y <!> gt;を作成できます。クラス、またはTriplet <!> lt; Z、Y、Z <!> gt;そしてそれらを返します。

Javascriptは、幸いなことに、動的言語です。つまり、任意の種類のオブジェクトを構築して返すことができます。これは、<!> quot; parameterized <!> quot;を持つという要件を効果的に満たします。どちらかといえばタイプセーフでない方法ではあるが、戻り値。

例:

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

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

複雑な戻り動作を処理する方法は、メソッドが呼び出すインターフェイスを渡すことです。 例:

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top