如果我想在任何.get
值上调用Option
时生成编译时错误,该怎么做?
还没有编写任何自定义宏,但您猜是时候该了吗?有指针吗?
最佳答案
有一个称为wartremover的编译器插件,可提供所需的内容。
https://github.com/typelevel/wartremover
它具有一些scala功能的错误消息和警告,出于安全考虑应避免使用。
这是来自github自述文件页面的OptionPartial疣的描述:
scala.Option
has aget
method which will throw if the value isNone
. The program should be refactored to usescala.Option#fold
to explicitly handle both theSome
andNone
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/