【问题标题】:scala uanpply without parameter没有参数的scala uanpply
【发布时间】:2019-04-12 02:18:15
【问题描述】:

我是一名在韩国学习 Scala 的学生。我正在学习模式匹配和取消应用方法。我感到困惑的是 Emergency 对象在 unapply 方法中有一个参数。不把参数放到match块里不知道是什么原因。

object Solution {

  def main(args: Array[String]) {

    val number1 = "010-123-1234"
    val number2 = "119"
    val number3 = "포도먹은 돼지"
    val numberList = List(number1, number2, number3)

    for (number <- numberList) {
      number match {
        case Emergency() => println("긴급전화다")
        case Normal(number) => println("일반 전화다" + number)
        case _ => println("판단할 수 없습니다.")
      }
    }
  }
}

object Emergency {
  def unapply(number: String): Boolean = {
    if (number.length == 3 && number.forall(_.isDigit)) true
    else false
  }
}

object Normal {
  def unapply(number: String): Option[Int] = {
    try {
      Some(number.replaceAll("-", "").toInt)
    } catch {
      case _: Throwable => None
    }
  }
}

【问题讨论】:

    标签: scala parameters unapply


    【解决方案1】:

    注意unapply 方法的返回类型是不同的。

    Normal.unapply 返回一个Option。执行case Normal(foo)时,调用unapply,如果返回Some(number),则匹配成功,将number赋值给局部变量foo,如果返回None,则匹配失败。

    Emergency.unapply返回一个Boolean,所以case Emergency()如果返回true则成功,否则失败,但成功时没有结果可分配,因此没有“参数”。

    【讨论】:

    • 对不起。我得到了正常部分,但是“在成功的情况下没有分配结果”是什么意思?这是否意味着如果我有返回值,我必须将参数放入?布尔值也是一个返回值。我想错了吗??
    • Normal(foo) 返回分配给fooIntEmergency() 不需要参数:true 匹配 case 子句,false 不需要。
    【解决方案2】:

    unapply中的参数是你要匹配的对象。

    在这种情况下,number 字符串变量被传递给Emergency.unapplyNormal.unapply 等。

    这个链接很好地解释了事情:

    https://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html

    【讨论】:

    • 我明白这一点。我感到困惑的是 Emergency 对象在 unapply 方法中有一个参数。但是为什么没有参数它可以工作
    • 上面的答案解释了这一点。
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多