Java有:
public void someMethod(int ... intArray) { // question: what is the equivalent to "..."
// do something with intArray
}
Run Code Online (Sandbox Code Playgroud)
如何在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是一些非字符串结构.
现在我只是绕过阵列.使用星号参数会非常好.有办法吗?
我一直想知道可变参数比初始化列表有什么优点.两者都提供相同的能力 - 将无限数量的参数传递给函数.
我个人认为初始化列表更优雅一些.语法不那么尴尬.
此外,随着参数数量的增加,初始化程序列表似乎具有明显更好的性能.
所以除了在C中使用可变参数的可能性之外我还缺少什么?
在java中有没有办法创建一个方法,期待两种不同的变量?我知道,由于编译器不知道从哪里开始或结束,因此使用相同的对象类型是不可能的.但为什么它也不可能与不同的对象类型?
例如:
public void doSomething(String... s, int... i){
//...
//...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法创建这样的方法?谢谢!
我有这段代码(总结)......
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++,至少据我所知,没有实现一个强类型的省略号函数,这是有效的:
void foo(double ...) {
// Do Something
}
Run Code Online (Sandbox Code Playgroud)
这意味着,简单地说:'用户可以将可变数量的术语传递给foo函数,但是,所有术语必须是双倍的'
请看下面的例子
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扩展后不允许位置参数?
例如,您可能具有复杂签名和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
情况:
我正在尝试编写一个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 {} = [])
fmt.Fprintf?从上一个问题:
如果你试图传递
float给printf它,它会double在printf收到它之前被提升
printf()是一个可变函数吧?可变参数函数在传递之前是否会提升float参数double?