请考虑以下代码:
private def test(some:String*){
}
private def call () {
val some = Array("asd", "zxc")
test(some)
}
Run Code Online (Sandbox Code Playgroud)
它打印expect String, found Array[String]为什么?Scala varargs不是数组吗?
注意
我在Stack Overflow上发现了几个关于Scala varargs的问题,但所有这些问题都是关于调用Java varargs方法或将Scala列表转换为数组.
也许这对你们大多数人来说显然都很简单,但是请你举个例子来说明如何创建类似的方法(在Objective-C中)和C中的函数来创建像NSStrings stringWithFormat:或者类似的函数NSLog().
提醒一下:
[NSString stringWithFormat:@"example tekst %i %@ %.2f", 122, @"sth", 3.1415"];
NSLog(@"account ID %i email %@", accountID, email);
Run Code Online (Sandbox Code Playgroud)
我想创建类似NSString的方法stringWithFormat:,NSURL - urlWithFormat.
我有一个List<Thing>,我想将它传递给声明的方法doIt(final Thing... things).有没有办法做到这一点?
代码看起来事情是这样的:
public doIt(final Thing... things)
{
// things get done here
}
List<Thing> things = /* initialized with all my things */;
doIt(things);
Run Code Online (Sandbox Code Playgroud)
该代码显然不能因为工作doIt()需要Thing不能List<Thing>.
有没有办法传入List作为varargs?
这是在Android应用程序中,但我不明白为什么该解决方案不适用于任何Java
va_end- 要重置的宏arg_ptr.
访问变量参数列表后,arg_ptr通常会重置指针va_end().我知道如果你想重新迭代这个列表是必需的,但如果你不去,它是否真的需要?这只是一种很好的做法,就像"永远拥有default:你的switch" 这一规则一样吗?
我知道我可以va_arg用来编写自己的可变参数函数,但是可变函数如何在引擎盖下工作,即在汇编指令级别?
例如,如何printf采用可变数量的参数?
*没有例外的规则.没有语言C/C++,但是,这两个问题都可以解答
*注意:最初给出的答案如何输出printf函数可以输出数字中的可变参数?,但它似乎不适用于提问者
除了%hn和%hhn(指定h或hh指定指向对象的大小),格式说明符的h和hh修饰符有printf什么意义?
由于标准要求的默认促销适用于可变函数,因此不可能将类型char或short(或其任何有符号/无符号变体)的参数传递给printf.
根据7.19.6.1(7),h修饰符:
指定以下d,i,o,u,x或X转换规范适用于short int或unsigned short int参数(该参数将根据整数提升进行提升,但其值应转换为short int或打印前的unsigned short int); 或者后续的n转换规范适用于指向short int参数的指针.
如果参数实际上是类型short或unsigned short,则促销int后转换回short或unsigned short将产生与促销相同的值int而不进行任何转换.因此,对于类型的参数short或unsigned short,%d,%u等应给予相同的结果到%hd,%hu等.(并且同样地对于char类型和hh).
据我所知,h或者hh修饰符可能有用的唯一情况是当参数将其传递int到范围之外时,short或者unsigned short …
我对ES2015中的spread语法和rest参数感到困惑.任何人都能用适当的例子来解释它们之间的区别吗?
我正试图弄清楚如何做以下事情:
def foo(msf: String, o: Any, os: Any*) = {
println( String.format(msf, o :: List(os:_*)) )
}
Run Code Online (Sandbox Code Playgroud)
有一个原因,我必须单独声明方法o和一个os Seq.基本上,我最终得到了使用单个对象参数(类型List)调用的格式方法.尝试:
def foo(msf: String, o: Any, os: Any*) = {
println( String.format(msf, (o :: List(os:_*))).toArray )
}
Run Code Online (Sandbox Code Playgroud)
给我类型错误:
发现:数组[任意]
必需的Seq [java.lang.Object]
我尝试过编译,编译但失败的原因和第一个例子差不多.当我尝试
println(String.format(msg, (o :: List(os:_*)) :_* ))
Run Code Online (Sandbox Code Playgroud)
这无法使用隐式转换歧义进行编译(any2ArrowAssoc和any2stringadd)
我有一个float [],我想得到一个具有相同元素的列表.我可以做一个又一个添加它们的丑陋的事情,但我想使用Arrays.asList方法.但是有一个问题.这有效:
List<Integer> list = Arrays.asList(1,2,3,4,5);
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
Run Code Online (Sandbox Code Playgroud)
asList方法接受一个varargs参数,对我来说,扩展是一个数组的"简写".
问题:
为什么第二段代码返回List<int[]>但不返回List<int>.
有没有办法纠正它?
为什么自动装箱不在这里工作; 即int[]到Integer[]?
我试过这个并从JAVA得到奇怪的行为,有人可以帮我解释一下吗?
boolean testNull(String... string) {
if(string == null) {
return true;
} else {
System.out.println(string.getClass());
return false;
}
}
boolean callTestNull(String s) {
return testNull(s);
}
Run Code Online (Sandbox Code Playgroud)
然后我有测试用例:
@Test
public void test_cases() {
assertTrue(instance.testNull(null)); // NULL
assertFalse(instance.testNull()); // NOT NULL
assertFalse(instance.callTestNull(null)); // NOT NULL
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果我打电话testNull()直接与参数null,我会true回来,但如果调用callTestNull()与null,它调用testNull(),它告诉我该参数不为空,但空数组.
c ×3
java ×3
arrays ×2
c++ ×2
list ×2
scala ×2
android ×1
ecmascript-6 ×1
ellipsis ×1
format ×1
javascript ×1
null ×1
objective-c ×1
printf ×1
promotions ×1
xcode ×1