首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许在析构提取器中对源/目标参数进行不同计数的任何方法

允许在析构提取器中对源/目标参数进行不同计数的任何方法
EN

Stack Overflow用户
提问于 2014-05-07 22:03:14
回答 1查看 57关注 0票数 1

正常成功)案例:正确数量的目标变量进行销毁:

代码语言:javascript
复制
scala> val arr = Array("aa","bb",1,2,3,4,5)
scala> val Array(a,b,one,two,three,four,five) = arr
a: Any = aa
b: Any = bb
one: Any = 1
two: Any = 2
three: Any = 3
four: Any = 4
five: Any = 5

不支持(?)案例

( a)销毁的目标变量较少:目的是将“其他”参数捕获到一个类似序列的变量中:

代码语言:javascript
复制
scala> val arr = Array("aa","bb",1,2,3,4,5)
arr: Array[Any] = Array(aa, bb, 1, 2, 3, 4, 5)
val Array(a,b,one,two, others) = arr
scala.MatchError: [Ljava.lang.Object;@146a8d2 (of class [Ljava.lang.Object;)
        at .<init>(<console>:12)
        at .<clinit>(<console>)
        at .<init>(<console>:7)
        at .<clinit>(<console>)
        at $print(<console>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)

( b)销毁的目标变量多于源变量:意图是有可选的源变量。

代码语言:javascript
复制
scala> val arr = Array("aa","bb",1,2,"optional-1","optional-2")
arr: Array[Any] = Array(aa, bb, 1, 2, optional-1, optional-2)

scala> val Array(a,b,one,two,optional1) = arr
scala.MatchError: [Ljava.lang.Object;@151c590 (of class [Ljava.lang.Object;)
        at .<init>(<console>:12)
        at .<clinit>(<console>)
        at .<init>(<console>:7)
        at .<clinit>(<console>)
        at $print(<console>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
        at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-07 22:11:09

List有一个解构的::操作符,它提供对a)的支持

代码语言:javascript
复制
scala> val l = List("aa","bb",1,2,"optional-1","optional-2")
l: List[Any] = List(aa, bb, 1, 2, optional-1, optional-2)

scala> val a :: b :: one :: two :: others = l
a: Any = aa
b: Any = bb
one: Any = 1
two: Any = 2
others: List[Any] = List(optional-1, optional-2)

在标准库中为其他数据结构提供此操作符的问题是,其他数据结构没有类似的性能特征。对Vector使用类似定义的操作符。

代码语言:javascript
复制
object :#: {
  def unapply[A](a: Vector[A]): Option[(A, Vector[A])] =
    if (a.length > 1) Some(a(0) -> a.drop(1))
    else None
}

scala> val a :#: b :#: one :#: two :#: others = v
a: Any = aa
b: Any = bb
one: Any = 1
two: Any = 2
others: Vector[Any] = Vector(optional-1, optional-2)

我不一定要推广这一点,但是您可以定义一个类似的操作符,它提供对用例b)的支持

代码语言:javascript
复制
object :?: {
  def unapply[A](l: List[A]): Option[(Option[A], List[A])] =
    l match {
      case Nil => Some(None -> Nil)
      case a :: tail => Some(Some(a) -> tail)
    }
}

scala> val l = List("aa","bb")
l: List[String] = List(aa, bb)

scala> val a :?: optional1 :?: optional2 :?: rest = l
a: Option[String] = Some(aa)
optional1: Option[String] = Some(bb)
optional2: Option[String] = None
rest: List[String] = List()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23529297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档