标签: unapply

Scala是否允许使用这种提取器?

假设我有这个系列:

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的东西怎么办?这适用于各种长度的数组(请注意,我在示例中为我的数组特别选择了不同的长度).

谢谢!

scala unapply

5
推荐指数
2
解决办法
1131
查看次数

在没有案例类的情况下理解unapply

我正在尝试下面的例子来理解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.

然而,当我声明Empcase类时,它完美地工作,没有任何编译错误.

有人可以解释这背后的原因吗?

注意:scalaVersion- 2.12.7

scala unapply

4
推荐指数
1
解决办法
32
查看次数

Scala匹配错误与unapply

我正在尝试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)

scala pattern-matching unapply

2
推荐指数
1
解决办法
1626
查看次数

scala unapply返回boolean

读到这个,我仍然对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 @ …

scala pattern-matching unapply

2
推荐指数
1
解决办法
2125
查看次数

使用特征中定义的 unapply

我有一个特质

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)

scala pattern-matching unapply

0
推荐指数
1
解决办法
167
查看次数

标签 统计

scala ×5

unapply ×5

pattern-matching ×3