Python,C ++,Scheme等都允许你定义在参数列表末尾带有可变数量参数的函数...
def function(a, b, *args):
#etc...
......可以按照以下方式调用:
function(1, 2)
function(1, 2, 5, 6, 7, 8)
etc ...是否有任何语言允许你在其他地方使用参数列表进行可变参数函数?像这样:
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]
答案 0 :(得分:2)
BASIC已经有这么多年了。
例如:
LOCATE [row%] [,[column%] [,[cursor%] [,start% [,stop%]]]]
此命令设置光标的位置(行%,列%),以及指定光标大小(start%,stop%)以及它是否实际可见(光标%)。这里,方括号中的所有内容都可以省略,如果是,则不会更改该属性。
用法示例:
LOCATE , 5
更改为第5列或
LOCATE 1, , 0
移动到第一行并使光标不可见。
可以看到的另一个命令是用于写入文件的PUT命令。如果省略中间参数(文件搜索位置),则在前一次写入之后进行写入。
重要的是,只有在内置语句中才能看到参数遗漏,而不是用户定义的过程和函数。
在实现方面,这是Microsoft Basic编译器(BC)似乎为LOCATE调用所做的事情:
答案 1 :(得分: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);
}
答案 2 :(得分:1)
几种语言(perl,python,许多其他语言)可以执行命名参数,类似于在参数列表中的任何位置执行可选参数...(命名参数可以按任何顺序出现,并且可以制作任何参数可选......)它们并不完全一样,但它们很接近......
不确定varargs,虽然它们通常可以替换为数组/散列/列表对象......
答案 3 :(得分:1)
Ruby的未来版本(1.9及更高版本,Ruby 1.9计划于2009年1月底发布)可以做到这一点。
然而,哪个值与哪个参数绑定并不总是很明显。
这是Ruby 1.9接受的:
0个或更多必填参数后跟0个或更多个可选参数,后跟0个或更多个必需参数,后跟rest参数,后跟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
如您所见,强制参数首先绑定在左侧和右侧。然后绑定可选参数,如果剩下任何参数,它们会捆绑在一个数组中并绑定到rest参数。
答案 4 :(得分:0)
Lisp's keyword parameters可能正是您要找的。我认为Ruby中有类似的安排。另请参阅Lisp's function parameters overview。
答案 5 :(得分:0)
我认为PHP很重要。您可以这样做来模拟您要查找的内容。就个人而言,我认为这会令人困惑。
function foo() {
$args = func_get_args(); // returns an array of args
}
答案 6 :(得分: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
>
答案 7 :(得分:0)
它被称为Rest Arguments,它至少可以在C ++和Java中完成。谷歌“休息参数”,你会发现很多关于这个主题的数据,有些例子可以传递数字并返回数字输入的平均值,也许是所有传递数字的最小值或最大值。正如您所看到的,这些功能有很多用途,我在代码中使用它来在MYSQL中输入数据,因此当我想添加一行时,我只需将Table名称添加为第一个字符串,其余的都是列名称,然后他们的数据,而不必坐在那里,一遍又一遍地手动完成。祝你好运!