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

发布于 2024-09-01 10:09:20 字数 433 浏览 5 评论 0原文

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

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

在 scala 中,它看起来像这样:

def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)

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

现在我只是传递数组。使用带星号的参数会非常好。有什么办法可以做到吗?

Here is something I can do in java, take the results of a repeated parameter and pass it to another method:

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

In scala it would look like this:

def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)

But this won't compile, the bar signature expects a series of individual strings, and the args passed in is some non-string structure.

For now I'm just passing around arrays. It would be very nice to use starred parameters. Is there some way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

⊕婉儿 2024-09-08 10:09:20

Java 假设您希望自动将数组args 转换为可变参数,但这对于接受对象类型可变参数的方法可能会出现问题。

Scala 要求您通过使用 : _* 指定参数来明确说明。

scala> def bar(args:String*) = println("count="+args.length)
bar: (args: String*)Unit

scala> def foo(args:String*) = bar(args: _*)
foo: (args: String*)Unit

scala> foo("1", "2")
count=2

您可以在 Seq 的任何子类型上使用 : _*,或者在任何可隐式转换为 Seq 的内容上使用 : _*,特别是 Array >。

scala> def foo(is: Int*) = is.length
foo: (is: Int*)Int

scala> foo(1, 2, 3)
res0: Int = 3

scala> foo(Seq(1, 2, 3): _*)
res1: Int = 3

scala> foo(List(1, 2, 3): _*)
res2: Int = 3

scala> foo(Array(1, 2, 3): _*)
res3: Int = 3

scala> import collection.JavaConversions._
import collection.JavaConversions._

scala> foo(java.util.Arrays.asList(1, 2, 3): _*)
res6: Int = 3

语言参考第 4.6 节中的示例对此进行了很好的解释.2.

请注意,这些示例是使用 Scala 2.8.0.RC2 编写的。

Java makes an assumption that you want to automatically convert the Array args to varargs, but this can be problematic with methods that accept varargs of type Object.

Scala requires that you be explicit, by ascribing the argument with : _*.

scala> def bar(args:String*) = println("count="+args.length)
bar: (args: String*)Unit

scala> def foo(args:String*) = bar(args: _*)
foo: (args: String*)Unit

scala> foo("1", "2")
count=2

You can use : _* on any subtype of Seq, or on anything implicitly convertable to a Seq, notably Array.

scala> def foo(is: Int*) = is.length
foo: (is: Int*)Int

scala> foo(1, 2, 3)
res0: Int = 3

scala> foo(Seq(1, 2, 3): _*)
res1: Int = 3

scala> foo(List(1, 2, 3): _*)
res2: Int = 3

scala> foo(Array(1, 2, 3): _*)
res3: Int = 3

scala> import collection.JavaConversions._
import collection.JavaConversions._

scala> foo(java.util.Arrays.asList(1, 2, 3): _*)
res6: Int = 3

It is explained well with examples in the Language Reference, in section 4.6.2.

Note that these examples are made with Scala 2.8.0.RC2.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文