gpt4 book ai didi

scala - 在 Scala 中将 Nil 和 List 作为 case 表达式

转载 作者:行者123 更新时间:2023-12-04 01:38:42 25 4
gpt4 key购买 nike

此代码编译:

def wtf(arg: Any) = {  
arg match {
case Nil => "Nil was passed to arg"
case List() => "List() was passed to arg"
case _ =>"otherwise"
}
}

但这个没有:
def wtf(arg: Any) = {  
arg match {
case List() => "List() was passed to arg"
case Nil => "Nil was passed to arg"
case _ =>"otherwise"
}
}

线路 case Nil => ... 被标记为无法访问的代码。为什么,在第一种情况下,行 case List() => ... 是不是标有同样的错误?

最佳答案

实际的答案需要了解一个不幸的实现细节,我花了很多时间去发现。

1) case List() 调用提取器,因为提取器调用任意函数,因此在一般情况下不可能进行穷举性/不可达性检查。到目前为止一切顺利,我们不能指望覆盖停机问题。

2) 早在编译器更“狂野的西部”时代,如果“case List()”被翻译成“case Nil”,模式匹配可以被大大加快(并且不会丢失穷举性检查) "在早期的编译器阶段,所以它会避免提取器。情况仍然如此,尽管它可以撤消,但显然很多人都被告知“case List() => ”非常好,我们不想突然对他们的所有代码进行悲观。所以我只需要找出一条出路。

您可以通过与其他一些类一起尝试来凭经验看到 List 具有特权。没有不可访问性错误。

import scala.collection.immutable.IndexedSeq
val Empty: IndexedSeq[Nothing] = IndexedSeq()
def wtf1(arg: Any) = {
arg match {
case Empty => "Nil was passed to arg"
case IndexedSeq() => "IndexedSeq() was passed to arg"
case _ =>"otherwise"
}
}

def wtf2(arg: Any) = {
arg match {
case IndexedSeq() => "IndexedSeq() was passed to arg"
case Empty => "Nil was passed to arg"
case _ =>"otherwise"
}
}

关于scala - 在 Scala 中将 Nil 和 List 作为 case 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7549111/

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