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

时间:2014-10-17 09:31:54

标签: scala scalaz

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

没有编写任何自定义宏,但猜测它是时候了吗?有什么指针吗?

2 个答案:

答案 0 :(得分:9)

有一个名为wartremover的编译器插件,可以提供您想要的内容。 https://github.com/typelevel/wartremover

它有一些错误消息和一些scala函数的警告,应该避免安全。

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

  

scala.Optionget方法,如果值为,则会抛出   None。该程序应重构为使用scala.Option#fold   明确处理SomeNone个案。

编译器插件

要将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页面。

答案 1 :(得分:3)

不完全是对您的问题的回答,但您可能更喜欢使用Scalaz的Maybe类型,这可以通过不使用.get方法来避免此问题。