私が見たオプションのパラメーターをサポートするすべてのプログラミング言語では、オプションのパラメーターを宣言の最後に表示する必要があるという模倣があります。オプション項目の後に必須パラメータを含めることはできません。その理由は何ですか?私はそれがコンパイラ/インタプリタの要件である可能性があると思います。
6 に答える
さて、彼らが最前線にいた場合、彼らが供給を停止したことをどのように検出しますか?唯一の方法は、オプションのパラメーターの後で変数タイプが異なる場合です。少し奇妙な要件なので、それらを最後に強制することは理にかなっています(「最後の」オプションのパラメーターを検出するための複雑なルールの手間を省きます)。
その上、それは関数を呼び出すときにそれを行う最も自然な方法です。
これは、これらの特定の言語の設計者が作成した任意のルールです。その制限があるべきであるという技術的な理由はまったくありません。
Rubyでは問題なく動作します。
def foo(m1, m2, o1='o1', o2='o2', *rest, m3, m4)
return m1, m2, o1, o2, rest, m3, m4
end
foo(1, 2, 3, 4)
# => [1, 2, 'o1', 'o2', [], 3, 4]
foo(1, 2, 3, 4, 5)
# => [1, 2, 3, 'o2', [], 4, 5]
foo(1, 2, 3, 4, 5, 6)
# => [1, 2, 3, 4, [], 5, 6]
foo(1, 2, 3, 4, 5, 6, 7)
# => [1, 2, 3, 4, [5], 6, 7]
foo(1, 2, 3, 4, 5, 6, 7, 8)
# => [1, 2, 3, 4, [5, 6], 7, 8]
すべての必須の引数を指定する必要があります。
foo(1, 2, 3)
# => ArgumentError: wrong number of arguments (3 for 4)
restパラメーターがないと、number_of_mandatory+number_of_optional以上の引数を指定するとエラーになります。
def bar(m1, m2, o1='o1', o2='o2', m3, m4)
return m1, m2, o1, o2, m3, m4
end
bar(1, 2, 3, 4, 5, 6, 7)
# => ArgumentError: wrong number of arguments (7 for 6)
パラメーター・リストの先頭にある必須パラメーターは、引数リストの先頭から左から右にバインドされます。パラメーター・リストの最後にある必須パラメーターは、引数リストの最後から右から左にバインドされます。オプションのパラメーターは、残りの引数リストの先頭から左から右にバインドされます。残ったすべての引数は、REST引数にバインドされます。
次のような宣言について考えてみます。
int foo(float a, int b=0, int c=0, float d);
(リストの中央でdefultパラメーターをどのように定義したかに注意してください)これは後で次のように呼び出されます
foo(0.0,1,2.0)
呼び出しは何ですか?特に省略されているb
かc
、省略されていますか?
コンパイラーの設計者は、名前付きパラメーターを使用してこれを回避できます
foo(a=0,c=0,d=2.0)
たとえば、Pythonで利用できる機能。
最後のオプションのパラメータを使用すると、ある時点でパラメータの指定を停止できます。
void Test(int a, optional int b = 0, optional int c = 0) { ... }
Test(3);
必須パラメーターを作成c
する場合は、次のような構文を使用する必要があります。
Test(3, , 2);
Test(a := 3, c := 2);
オプションのパラメータの利点は、存在しないかのように扱うことができることです。オプションのパラメーターがパラメーターリストの真ん中にある場合、これは「コンマを数える」か、過度に冗長な構文を使用しないと不可能です。
推測するだけです。これは、呼び出し規約と関係がある可能性があります(たとえば、パラメーターはスタックの左から右にプッシュされ、オプションのパラメーターは、指定されていない場合は単に省略されます)。
JavaとC#には名前付きパラメーターがないため、次のことはできません。
myfunction(param1='Meh', optionalParam=2)
あなたはしなければならない:
myfunction('Meh', 2)
さもないと
myFunction(2, 'Meh')
あいまいです。コンパイラは、オプションのパラメータセットに2が含まれていることをどのように認識しているのでしょうか。