Scala 用于可选案例类创建的API符合一般开发人员的期望
从显而易见的角度来看,对于可选的案例类创建,什么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
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。