标签: variadic-functions

Scala如何在方法定义中接收多个参数?

Java有:

public void someMethod(int ... intArray) { // question: what is the equivalent to "..." 
    // do something with intArray
}
Run Code Online (Sandbox Code Playgroud)

如何在Scala中实现相同的功能?也就是说,将未定义数量的参数传递给方法?

java scala variadic-functions

30
推荐指数
2
解决办法
3万
查看次数

在scala中,我可以将重复参数传递给其他方法吗?

这是我可以在java中做的事情,获取重复参数的结果并将其传递给另一个方法:

public void foo(String ... args){bar(args);}
public void bar(String ... args){System.out.println("count="+args.length);}
Run Code Online (Sandbox Code Playgroud)

在scala中它看起来像这样:

def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)
Run Code Online (Sandbox Code Playgroud)

但这不会编译,bar签名需要一系列单独的字符串,而传入的args是一些非字符串结构.

现在我只是绕过阵列.使用星号参数会非常好.有办法吗?

parameters methods scala variadic-functions

30
推荐指数
1
解决办法
1万
查看次数

为什么在初始化列表可用时使用可变参数?

我一直想知道可变参数比初始化列表有什么优点.两者都提供相同的能力 - 将无限数量的参数传递给函数.

我个人认为初始化列表更优雅一些.语法不那么尴尬.

此外,随着参数数量的增加,初始化程序列表似乎具有明显更好的性能.

所以除了在C中使用可变参数的可能性之外我还缺少什么?

c++ performance variadic-functions initializer-list c++11

30
推荐指数
1
解决办法
1万
查看次数

Java两种方法中的varargs

在java中有没有办法创建一个方法,期待两种不同的变量?我知道,由于编译器不知道从哪里开始或结束,因此使用相同的对象类型是不可能的.但为什么它也不可能与不同的对象类型?

例如:

public void doSomething(String... s, int... i){
    //...
    //...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法创建这样的方法?谢谢!

java arrays variadic-functions

30
推荐指数
4
解决办法
2万
查看次数

有没有使用带参考参数的varargs

我有这段代码(总结)......

AnsiString working(AnsiString format,...)
{
    va_list argptr;
    AnsiString buff;

    va_start(argptr, format);
    buff.vprintf(format.c_str(), argptr);

    va_end(argptr);
    return buff;
}
Run Code Online (Sandbox Code Playgroud)

并且,在可能的情况下优先考虑通过参考,我因此改变了它.

AnsiString broken(const AnsiString &format,...)
{
... the rest, totally identical ...
}
Run Code Online (Sandbox Code Playgroud)

我的主叫代码是这样的: -

AnsiString s1, s2;
    s1 = working("Hello %s", "World");
    s2 = broken("Hello %s", "World");
Run Code Online (Sandbox Code Playgroud)

但是,s1包含"Hello World",而s2包含"Hello(null)".我认为这是由于va_start的工作方式,但我不确定是怎么回事.

c++ reference variadic-functions

29
推荐指数
2
解决办法
8910
查看次数

为什么C++不支持强类型省略号?

有人可以向我解释为什么C++,至少据我所知,没有实现一个强类型的省略号函数,这是有效的:

void foo(double ...) {
 // Do Something
}
Run Code Online (Sandbox Code Playgroud)

这意味着,简单地说:'用户可以将可变数量的术语传递给foo函数,但是,所有术语必须是双倍的'

c++ ellipsis variadic-functions

29
推荐指数
3
解决办法
7567
查看次数

为什么Python中不允许使用foo(*arg,x)?

请看下面的例子

point = (1, 2)
size = (2, 3)
color = 'red'

class Rect(object):
    def __init__(self, x, y, width, height, color):
        pass
Run Code Online (Sandbox Code Playgroud)

打电话是非常诱人的:

Rect(*point, *size, color)
Run Code Online (Sandbox Code Playgroud)

可能的解决方法是:

Rect(point[0], point[1], size[0], size[1], color)

Rect(*(point + size), color=color)

Rect(*(point + size + (color,)))
Run Code Online (Sandbox Code Playgroud)

但是为什么Rect(*point, *size, color)不允许,你能想到的是否存在任何语义模糊或普遍缺点?

编辑:具体问题

为什么在函数调用中不允许多个*arg扩展?

为什么*arg扩展后不允许位置参数?

python function variadic-functions

28
推荐指数
2
解决办法
703
查看次数

Kotlin:你能为varargs使用命名参数吗?

例如,您可能具有复杂签名和varargs的功能:

fun complicated(easy: Boolean = false, hard: Boolean = true, vararg numbers: Int)
Run Code Online (Sandbox Code Playgroud)

你应该能够像这样调用这个函数是有道理的:

complicated(numbers = 1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

不幸的是,编译器不允许这样做.

是否可以为varargs使用命名参数?有没有聪明的解决方法?

function default-value variadic-functions named-parameters kotlin

28
推荐指数
3
解决办法
8406
查看次数

Go - 可变参数函数参数传递

情况:

我正在尝试编写一个fmt.Fprintf包含可变数量参数的简单包装器.这是代码:

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args)
    fmt.Fprintf(os.Stderr, "%v\n", str)
    os.Exit(1)
}
Run Code Online (Sandbox Code Playgroud)

问题:

当我调用它时Die("foo"),我得到以下输出(而不是" foo "):

foo%!(EXTRA [] interface {} = [])

  • 为什么在" foo " 之后有" %!(EXTRA [] interface {} = []) "?
  • 创建包装器的正确方法是什么fmt.Fprintf

variadic-functions go

27
推荐指数
1
解决办法
8062
查看次数

为什么printf()将float提升为double?

从上一个问题:

如果你试图传递floatprintf它,它会doubleprintf收到它之前被提升

printf()是一个可变函数吧?可变参数函数在传递之前是否会提升float参数double

c c++ floating-point printf variadic-functions

27
推荐指数
4
解决办法
3193
查看次数