【问题标题】:In scala can I pass repeated parameters to other methods?在scala中我可以将重复的参数传递给其他方法吗?
【发布时间】:2011-02-19 15:03:03
【问题描述】:

这是我可以在 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 是一些非字符串结构。

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

【问题讨论】:

    标签: scala parameters methods variadic-functions


    【解决方案1】:

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

    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
    

    Language Reference 的4.6.2 节中通过示例很好地解释了这一点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 2020-10-27
      • 1970-01-01
      相关资源
      最近更新 更多