パラメータ化された入力があるのに、関数がパラメータ化された戻り値の型を持たないのはなぜですか?
-
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);