1

Python、C ++、Schemeなどはすべて、引数リストの最後に可変数の引数を取る関数を定義できます...

def function(a, b, *args):
    #etc...

...次のように呼び出すことができます:

function(1, 2)
function(1, 2, 5, 6, 7, 8)

など...引数リストを使用して可変個引数関数を他の場所で実行できる言語はありますか?このようなもの:

def function(int a, string... args, int theend) {...}

これらすべてが有効な場合:

function(1, 2)
function(1, "a", 3)
function(1, "b", "c", 4)

また、引数リストのどこかにあるオプションの引数はどうですか?

def function(int a, int? b, int c, int... d) {}

function(1, 2) //a=1, c=2, b=undefined/null/something, d=[]
function(1,2,3) //a=1, b=2, c=3,d=[]
function(1,2,3,4,5) //a=1, b=2, c=3, d=[4,5]
4

8 に答える 8

2

BASICは何年もの間これを持っていました。

例えば:

LOCATE [row%] [,[column%] [,[cursor%] [,start% [,stop%]]]]

このコマンドは、カーソルの位置(row%、column%)を設定し、カーソルサイズ(start%、stop%)と実際に表示されるかどうか(cursor%)を指定します。ここでは、角括弧内のすべてを省略できます。省略した場合、そのプロパティは変更されません。

使用例:

LOCATE , 5

5列目に変更する、または

LOCATE 1, , 0

最初の行に移動してカーソルを非表示にします。

これが見られるもう1つのコマンドは、ファイルに書き込むためのPUTコマンドです。真ん中の引数(ファイルシーク位置)を省略すると、前回の書き込みの直後に書き込みが行われます。

重要なことに、引数の省略は組み込みのステートメントでのみ見られ、ユーザー定義のプロシージャや関数では見られません。

実装に関しては、これはMicrosoft Basicコンパイラ(BC)がLOCATEの呼び出しに対して行うように思われることです。

  1. 各引数について:
    • 引数を省略した場合は、0を押してください
    • 引数が指定されている場合は、1を押してから、実際の値を押します
  2. 引数カウントをプッシュ
  3. ライブラリ関数を呼び出す
于 2008-12-23T06:39:40.607 に答える
2

次の C++ は、次の構文でそれを行うことができます。

void f(int a, std::initializer_list<int> b, int c) {
    // b.begin(), b.end(), b.size() allow to access them
}

void g() { 
    f(1, { 2, 3, 4, 5 }, 2);
}
于 2008-12-23T07:10:56.127 に答える
1

いくつかの言語 (perl、python、その他の多く) は名前付き引数を実行できます。これは、パラメーター リストの任意の場所でオプションの引数を実行するのと似ています... (名前付きパラメーターは任意の順序で表示でき、それらのいずれかをオプションにすることができます.. .) 厳密には同じではありませんが、近いものです...

通常は配列/ハッシュ/リストオブジェクトに置き換えることができますが、varargsについてはわかりません...

于 2008-12-23T08:58:33.337 に答える
1

Ruby の将来のバージョン (1.9 以降。Ruby 1.9 は 2009 年 1 月末にリリースされる予定です) でこれを行うことができます。

ただし、どの値がどのパラメーターにバインドされるかは、必ずしも明らかではありません。

これは Ruby 1.9 が受け入れるものです:

0 個以上の必須引数の後に 0 個以上のオプション引数が続き、その後に 0 個以上の必須引数が続き、その後に残りの引数が続き、その後に 0 個以上の必須引数が続きます。

例:

def meth mand1, opt1 = :def1, o2 = :d2, *args, m2, m3
  puts %w[mand1 opt1 o2 m2 args m3].inject('') { |s, arg|
    s << "#{arg} = #{(eval arg).inspect}, "
  }.gsub /, $/, ''
end

meth :arg1, :a2, :a3
# => mand1 = :arg1, opt1 = :def1, o2 = :d2, m2 = :a2, args = [], m3 = :a3
meth :arg1, :a2, :a3, :a4
# => mand1 = :arg1, opt1 = :a2, o2 = :d2, m2 = :a3, args = [], m3 = :a4
meth :arg1, :a2, :a3, :a4, :a5
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a4, args = [], m3 = :a5
meth :arg1, :a2, :a3, :a4, :a5, :a6
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a5, args = [:a4], m3 = :a6
meth :arg1, :a2, :a3, :a4, :a5, :a6, :a7
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a6, args = [:a4, :a5], m3 = :a7

ご覧のとおり、必須の引数は、左と右の両方から最初にバインドされます。次に、オプションの引数がバインドされ、引数が残っている場合、それらは配列にまとめられ、残りの引数にバインドされます。

于 2008-12-23T16:19:46.660 に答える
0

Lispのキーワードパラメータはあなたが探しているものかもしれません。Rubyにも同様の配置があると思います。Lispの関数パラメータの概要も参照してください。

于 2008-12-23T06:34:46.420 に答える
0

PHPが重要だと思います。これを実行して、探しているものをシミュレートできます。個人的には、それは混乱を招くと思います。

function foo() {
    $args = func_get_args(); // returns an array of args
}
于 2008-12-23T06:35:50.660 に答える
0

R (統計言語) にもそれがあり、リストの中間にある場合もありますが、微妙なセマンティクスがあります。

http://cran.r-project.org/doc/manuals/R-intro.html#The-three-dots-argument

> f1 <- function(x,...,y) {  return(x+y) }
> f1(1,2)
Error in f1(1, 2) : argument "y" is missing, with no default
> f1(1,y=2)
[1] 3
> f1 <- function(x,...,y) {  return(x+y) }
> f1(1,2)
Error in f1(1, 2) : argument "y" is missing, with no default
> f1(1,y=2)
[1] 3
> 
于 2009-05-22T22:26:54.943 に答える