gpt4 book ai didi

scala - 带括号和不带模式匹配的单例对象的区别?

转载 作者:行者123 更新时间:2023-12-02 08:00:07 24 4
gpt4 key购买 nike

在使用 even() 时,它是否只匹配 unapply 中的真实条件以及在使用 even 时,这是如何做到的仍然打印 "Is even"

object even{
def unapply(arg: Int): Boolean = (arg%2 == 0)
}
object singleDigit{
def unapply(arg: Int): Option[Boolean] = {
if(arg < 10) Some(true)
else None
}
}
val n = 9
n match {
case even() => println("Is even")
case singleDigit => println("is single")
case _ => println("No property")
}
//This gives "is single"

n match {
case even => println("Is even")
case singleDigit => println("is single")
case _ => println("No property")
}
//This gives "Is even"

偶数情况如何满足 n=9 作为奇数?这个模式匹配中的 even 和 even() 有什么区别?

最佳答案

case even => 实际上是一个变量 模式,并不像编译器警告所暗示的那样引用 even.unapply

Warning:(19, 9) patterns after a variable pattern cannot match (SLS 8.1.1)
If you intended to match against object even in class A$A3, you must use backticks, like: case `even` =>
case even => println("Is even")
^

你只是碰巧给了它相同的名字,但你可以这样写

n match {
case foo => println("Is even")
...
}

它仍然会打印出 Is even 因为可变模式在第一个位置。

关于scala - 带括号和不带模式匹配的单例对象的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58473594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com