我害怕varargs.我不知道该怎么用它们.
另外,让人们通过他们想要的许多论点是危险的.
什么是上下文的一个例子,它将是一个使用它们的好地方?
我最近遇到了java @SafeVarargs注释.谷歌搜索使Java中的可变函数不安全的原因让我感到困惑(堆中毒?擦除类型?),所以我想知道一些事情:
是什么让可变参数Java函数在@SafeVarargs意义上不安全(最好以深入的例子的形式解释)?
为什么这个注释留给程序员自行决定?这不是编译器应该能够检查的东西吗?
是否有必须坚持一些标准,以确保他的功能确实安全?如果没有,确保它的最佳做法是什么?
是否可以从数组中向JavaScript函数发送可变数量的参数?
var arr = ['a','b','c']
var func = function()
{
// debug
alert(arguments.length);
//
for(arg in arguments)
alert(arg);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
Run Code Online (Sandbox Code Playgroud)
我最近写了很多Python,这是一个很好的模式,能够接受varargs并发送它们.例如
def func(*args):
print len(args)
for i in args:
print i
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(*arr) // prints 4 which is what I want, then 'a','b','c','d'
Run Code Online (Sandbox Code Playgroud)
在JavaScript中是否可以发送一个数组作为参数数组?
我一直试图使用Mockito模拟一个使用vararg参数的方法:
interface A {
B b(int x, int y, C... c);
}
A a = mock(A.class);
B b = mock(B.class);
when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));
Run Code Online (Sandbox Code Playgroud)
这不起作用,但是如果我这样做:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Run Code Online (Sandbox Code Playgroud)
尽管我在删除方法时完全省略了varargs参数,但这仍然有效.
有线索吗?
在Swift编程语言中,它说:
函数也可以采用可变数量的参数,将它们收集到一个数组中.
Run Code Online (Sandbox Code Playgroud)func sumOf(numbers: Int...) -> Int { ... }
当我用逗号分隔的数字列表(`sumOf(1,2,3,4))调用这样的函数时,它们可以作为函数内的数组使用.
问:如果我已经有一个数字数组要传递给这个函数怎么办?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
Run Code Online (Sandbox Code Playgroud)
这会因编译器错误而失败,"无法找到接受所提供参数的'__conversion'的重载".有没有办法将现有数组转换为可以传递给可变函数的元素列表?
是否可以声明一个允许可变数量参数的方法?
定义中使用的符号是什么,表明该方法应该允许可变数量的参数?
答案: varargs
我有一个PHP函数,它接受可变数量的参数(使用func_num_args()和func_get_args()),但我想传递函数的参数数量取决于数组的长度.有没有办法用可变数量的参数调用 PHP函数?
在C#中,如果您希望方法具有不确定数量的参数,则可以在方法签名中创建最终参数a params,以使方法参数看起来像一个数组,但允许使用该方法的每个人传递该类型的参数正如来电者想要的那样.
我很确定Java支持类似的行为,但我无法找到如何做到这一点.
所以我有2个函数都有相似的参数
void example(int a, int b, ...);
void exampleB(int b, ...);
Run Code Online (Sandbox Code Playgroud)
现在example调用exampleB,但是如何在不修改的情况下传递变量参数列表中的变量exampleB(因为这已经在别处使用过了).
Haskell的类型安全性仅对于依赖类型的语言是首屈一指的.但是Text.Printf有一些深刻的魔力似乎相当类型.
> printf "%d\n" 3
3
> printf "%s %f %d" "foo" 3.3 3
foo 3.3 3
Run Code Online (Sandbox Code Playgroud)
这背后的深层魔力是什么?该Text.Printf.printf函数如何采用像这样的可变参数?
用于允许Haskell中的可变参数的一般技术是什么,它是如何工作的?
(旁注:使用这种技术时,某种类型的安全性显然会丢失.)
> :t printf "%d\n" "foo"
printf "%d\n" "foo" :: (PrintfType ([Char] -> t)) => t
Run Code Online (Sandbox Code Playgroud)