scala - 放弃在Option上调用 `get`并生成编译错误

标签 scala scalaz

如果我想在任何.get值上调用Option时生成编译时错误,该怎么做?

还没有编写任何自定义宏,但您猜是时候该了吗?有指针吗?

最佳答案

有一个称为wartremover的编译器插件,可提供所需的内容。
https://github.com/typelevel/wartremover

它具有一些scala功能的错误消息和警告,出于安全考虑应避免使用。

这是来自github自述文件页面的OptionPartial疣的描述:

scala.Option has a get method which will throw if the value is None. The program should be refactored to use scala.Option#fold to explicitly handle both the Some and None cases.



编译器插件

要将wartremover作为插件添加到scalac,需要将其添加到project/plugins.sbt中:
resolvers += Resolver.sonatypeRepo("releases")

addSbtPlugin("org.brianmckenna" % "sbt-wartremover" % "0.11")

并在您的build.sbt中激活它:
wartremoverErrors ++= Warts.unsafe

巨集

https://github.com/typelevel/wartremover/blob/master/OTHER-WAYS.md描述了如何使用插件的其他方式,如问题中所述,其中之一就是将其用作宏。

将疣去除剂作为库添加到您的build.sbt中:
resolvers += Resolver.sonatypeRepo("releases")

libraryDependencies += "org.brianmckenna" %% "wartremover" % "0.11"

您可以将任何疣都变成宏,如下所示:
scala> import language.experimental.macros
import language.experimental.macros

scala> import org.brianmckenna.wartremover.warts.Unsafe
import org.brianmckenna.wartremover.warts.Unsafe

scala> def safe(expr: Any):Any = macro Unsafe.asMacro
safe: (expr: Any)Any

scala> safe { 1.some.get  }
<console>:10: error: Option#get is disabled - use Option#fold instead
              safe { 1.some.get  }

该示例改编自wartremover github页面。

关于scala - 放弃在Option上调用 `get`并生成编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422049/

相关文章:

Scala:类型参数中的问号

scala - Scalaz 中的 Future[List[Option[List[Double]]] 到 Future[Option[List[List[Double]]]

scala - 如何帮助 Scalaz 进行类型推断和 2 个类型参数

javascript - 斯卡拉JS : Call a Javascript function on an element

python - Spark- 计算一列在另一列之后的百分比

scala - Deequ中的唯一性检查

scala - 将 AnyRef 装箱到选项中的方法在哪里?

list - 带 Scalaz 的 ZipList

scala - 通过不同包中的类继承包保护的方法

Scala:SeqT monad 转换器?