scala - 将 Option、Some 和 None 密封类型重命名为特定于域的语言?

我想声明一些类型,它们是 OptionSomeNone,但以更适合我的域的不同名称引用,以提高代码可读性。因为虽然 Option 的功能确实将 1:1 映射到我的问题域,但乍一看并不十分明显,因此将这种类型称为“选项”会令人困惑。

我的第一个想法是使用类型别名:

type Foo[T] = Option[T]
type Bar[T] = Some[T]
type Bash = None.type

但是,模式匹配时我不能使用这种新的“语言”:

def example(f: Foo[Int]) = f match {
  case Bar(_) => "got bar"
  case Bash => "got bash"
}
/*
On line 2: error: not found: value Bar
         case Bash => "got bash"
              ^
On line 3: error: not found: value Bash
       Identifiers that begin with uppercase are not pattern variables but match the value in scope.
*/

接下来我想简单地继承子类,但是 Option 是密封的——有充分的理由——所以这是不可能的:

trait Foo[T] extends Option[T]
// error: illegal inheritance from sealed class Option

最后,我认为我很聪明地尝试在导入时重命名:

// BEGIN Foo.scala
import scala.{Option => Foo}
import scala.{Some => Bar}
import scala.{None => Bash}

// This works!
def example(f: Foo[Int]) = f match {
  case Bar(_) => "got bar"
  case Bash => "got bash"
}

...但是没有办法导出新声明的名称以在当前文件之外使用?:

// BEGIN OtherFileThatUsesFoo.scala

// Doesn't compile because Option must be called either "Option" or "Foo" and not both
case class Person(child: Option[Person], foo: Foo[Int])

除了简单地用不同的名称实现 Option 之外,我还缺少另一个选项吗?

回答1

@Luis Miguel Mejía Suárez 在评论中有它!

type Foo[T] = Option[T]
val Foo = Option
type Bar[T] = Some[T]
val Bar = Some
type Bash = None.type
val Bash = None

// Compiles and runs correctly!
def example(f: Foo[Int]) = f match {
  case Bar(_) => "got bar"
  case Bash => "got bash"
}

我还需要为伴随对象“别名”,例如 val Foo = Option

相似文章

javascript - 警告框反复出现,不允许用户输入

我正在编写倒计时。当用户在没有给出任何输入的情况下单击开始时,它会通过警报功能出现一个框,该框显示消息“需要输入”。如果用户在警告消息后给出任何输入并单击开始,则即使条件不允许,警告框也不希望再次出现...

javascript - 水平选中复选框时阻止 <select>

我在执行某个命令时遇到问题。单击复选框后,我希望它水平锁定字段。我需要代码来执行命令,单击“复选框”后它将阻止小时复选框。我已经尝试过If(),但它没有按应有的方式工作,将我锁定在所有领域,而不仅仅是...

最新文章