代码之家  ›  专栏  ›  技术社区  ›  Elazar Leibovich

scala中非元组的多重赋值

  •  27
  • Elazar Leibovich  · 技术社区  · 14 年前

    澄清一下,当我说多重赋值,并行赋值,解构绑定时,我指的是下面的模式匹配gem

    scala> val (x,y) = Tuple2("one",1)
    x: java.lang.String = one
    y: Int = 1
    

    哪个分配 "one" x 1 y .

    我只是想

    val (x,y) = "a b".split()
    

    我原以为scala会尝试用模式匹配数组,如果数组的长度与模式的长度不匹配,就会抛出运行时异常。

    我所有的努力 Array Tuple2 都是徒劳的。

    scala> Tuple2(Array(1,2):_*)
    <console>:7: error: wrong number of arguments for method apply: (T1,T2)(T1, T2)
    in object Tuple2
           Tuple2(Array(1,2):_*)
           ^
    
    scala> Tuple2(Array(1,2).toList:_*)
    <console>:7: error: wrong number of arguments for method apply: (T1,T2)(T1, T2)
    in object Tuple2
           Tuple2(Array(1,2).toList:_*)
    

    3 回复  |  直到 14 年前
        1
  •  53
  •   Randall Schulz    11 年前

    所有你需要做的就是使你的val侧(左边的 = )与您的初始值设定项兼容(右侧 = ):

    scala> val Array(x, y, z) = "XXX,YYY,ZZZ".split(",")
    x: java.lang.String = XXX
    y: java.lang.String = YYY
    z: java.lang.String = ZZZ
    

    如你所料,一个 scala.MatchError

        2
  •  12
  •   Dario    14 年前

    由于您的字符串可以包含任意内容,因此类型系统不能保证结果具有2元组形式(并且任何转换都没有意义)。所以你必须处理 序列 (就像数组)无论如何。

    right-ignoring sequence patterns 允许您方便地匹配结果值。

    val Seq(x, y, _ @ _*) = "a b".split(" ")
    
        3
  •  10
  •   Jim Balter    14 年前
    x:java.lang.String=a
    y:java.lang.String=b