假设我有这个系列:
val a = Array(Array(1,2,3,4,5),Array(4,5),Array(5),Array(1,2,6,7,8))
Run Code Online (Sandbox Code Playgroud)
有没有办法定义一个可以按以下方式工作的提取器:
a.foreach(e => {
e match {
case Array( ending with 5 ) =>
case _ =>
}
})
Run Code Online (Sandbox Code Playgroud)
对不起伪代码,但我不知道如何表达它.有没有办法匹配5个作为最后一个元素的东西?如果我想匹配第一个元素为1而最后一个元素为5的东西怎么办?这适用于各种长度的数组(请注意,我在示例中为我的数组特别选择了不同的长度).
谢谢!
我正在尝试下面的例子来理解unapply,
class Emp(name: String, age: Int)
object Emp {
def apply(name: String, age: Int): Emp = new Emp(name, age)
def unapply(emp: Emp): Option[(String, Int)] = Some(emp.name, emp.age)
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,失败,编译错误Cannot resolve symbol name,Cannot resolve symbol age.
然而,当我声明Emp为case类时,它完美地工作,没有任何编译错误.
有人可以解释这背后的原因吗?
注意:scalaVersion- 2.12.7
我正在尝试http://www.scala-lang.org/node/112上的代码,我得到一个匹配错误,看起来不应该抛出一个.
这是原始代码:
object Twice {
def apply(x: Int): Int = x * 2
def unapply(z: Int): Option[Int] = if (z%2 == 0) Some(z/2) else None
}
object TwiceTest extends Application {
val x = Twice(21)
x match { case Twice(n) => Console.println(n) } // prints 21
}
Run Code Online (Sandbox Code Playgroud)
我刚刚添加了几行来测试当我传递奇数时会发生什么:
object TwiceTest extends Application {
val x = Twice(21)
x match { case Twice(n) => Console.println(n) } // prints 21
val y = 21
y match { case Twice(n) => …Run Code Online (Sandbox Code Playgroud) 读到这个,我仍然对unapply()这个回报有疑问Boolean.
如果看一下Scala编程手册(第2版),第602页.有一个例子:
case Email(Twice(x @ UpperCase()), domain) => ...
Run Code Online (Sandbox Code Playgroud)
其中UpperCase定义为unapply()返回Boolean但没有的对象apply()
object UpperCase {
def unapply(s:String): Boolean = s.toUpperCase == s
}
Run Code Online (Sandbox Code Playgroud)
哪里Twice是这样的:
object Twice {
def apply(s:String): String = s + s
...
Run Code Online (Sandbox Code Playgroud)
问题是(必须太多,对不起):
UpperCase().unapply(..)如何在这里工作?
如果我通过:DIDI@hotmail.com,那么x在第一个代码片段='DI'..然后我们使用'@'..来绑定'x'将它传递UpperCase.unapply给调用unapply(x)ie unapply('DIDI')(?)然后它返回True.
但为什么不Option呢?我倾向于认为unapply返回Option......它是如何运作的一种方式.这可能是因为通常Option包装一些数据,但对于简单的情况,我们不应该包装布尔值?因为我们没有申请()?
有什么区别,何时使用Boolean/ Option?基于这个例子.
这个语法:x @ …
我有一个特质
trait A {
def doSomething(a: Seq[Int]): Seq[String] = {
a.map {
case AA(s) => s // want to use unapply defined in trait (this(AA) not allowed)
case _ => "idc"
}
}
def unapply(a: Int): Option[String] = getString(a)
def getString(a: Int): Option[String] = {
a match {
case 1 => Some("one")
case 2 => Some("two")
case _ => None
}
}
}
object AA extends A
object AA2 extends A {
override def getString(a: Int): Option[String] = {
super.getString(a).orElse{ …Run Code Online (Sandbox Code Playgroud)