Scala 用于可选案例类创建的API符合一般开发人员的期望

Scala 用于可选案例类创建的API符合一般开发人员的期望,scala,option,case-class,Scala,Option,Case Class,从显而易见的角度来看,对于可选的案例类创建,什么Api最适合使用 假设我有这个案例课 case class Position(position: Int) 位置不应超出范围[0,18]。此外,我希望这是fp友好的,这样当这个约束被违反时,参数就不能被拒绝,除非发生异常 有没有比这更好的方法,使用工厂方法生成选项 object Position { def apply(position: Int): Option[Position] = if (in range) Some(Pos

从显而易见的角度来看,对于可选的案例类创建,什么Api最适合使用

假设我有这个案例课

case class Position(position: Int)
位置不应超出范围[0,18]。此外,我希望这是fp友好的,这样当这个约束被违反时,参数就不能被拒绝,除非发生异常

有没有比这更好的方法,使用工厂方法生成选项

object Position {

  def apply(position: Int): Option[Position] =
    if (in range) Some(Position(position)) else None

}
调用此选项时,不清楚是否会返回一个选项

val p = Position(99)
这样会更好吗

object Position {

  def maybe(position: Int): Option[Position] =
    if(in range) Some(Position(position)) else None

}
那么用法就变成了,

val p = Position.maybe(99)
但是
可能只是澄清结果类型的样板


这是我采用的解决方案,基于链接的重复答案

case class Port private(portNumber: Int)

object Port {

  private val ValidRange = Range(0, 65535+1)

  def opt(portNumber: Int): Option[Port] =
    if (ValidRange contains portNumber)
      Some(Port(portNumber))
    else
      None
}

选择了
opt
,而不是
fromInt
make
create
,因为这给出了一个提示,结果是
Option[T]

可能与我使用的
create
重复,但没有真正正确的答案(除了“不要使用
应用
”).我会选择类似于
fromInt
。scala中很常见的模式是
toX
fromX
,前者总是返回一个值,而后者返回一个
选项[X]
如果
Position
被定义为case类,即使它不是,
apply
返回一个
选项仍然是意外的。@Imm true,您可以执行如下操作:
def foo(n:Nat)(隐式lt:LTEq[n.n,_18])=…
,但这只适用于常量int。