Scala - 如何使用接收对象作为参数的构造函数创建 class
Scala - How to create a class with a constructor that receives an object as parameter
我在 Scala 中有两个 classes - 一个是另一个的 属性。我想为父 class 创建一个智能构造函数,但我真的不知道什么是最佳实践。我做了一些研究,但没有找到令人满意的 solution/explanation。
这是我的class。
final class Role(role: String) //child
object Role:
def isRoleValid(role: String): Boolean =
val pattern = "([a-zA-Z])+".r
pattern.matches(role)
def newRole(role: String): Role = Role(role)
def from(role: String): Option[Role] =
if(isRoleValid(role)) Some(newRole(role))
else None
final class NurseRequirement(role: Role, number: Int) //Parent
object NurseRequirement:
def isNumberValid(number: Int): Boolean = number > 0
//What should I do to validate the Role object??
我强烈怀疑你真的想要这样的伴生对象:
def from(s: String, n: Int): Option[NurseRequirement] =
if isNumberValid(n)
then Role.from(s).map(NurseRequirement(_, n))
else None
如果您遇到有更多此类可选子组件的情况,您可以使用 Option
上的 for
-comprehensions 摆脱嵌套的 if
,即类似于:
def from(s: String, n: Int) =
for
r <- Role.from(s)
m <- Option(n).filter(isNumberValid)
yield NurseRequirement(r, m)
我在 Scala 中有两个 classes - 一个是另一个的 属性。我想为父 class 创建一个智能构造函数,但我真的不知道什么是最佳实践。我做了一些研究,但没有找到令人满意的 solution/explanation。
这是我的class。
final class Role(role: String) //child
object Role:
def isRoleValid(role: String): Boolean =
val pattern = "([a-zA-Z])+".r
pattern.matches(role)
def newRole(role: String): Role = Role(role)
def from(role: String): Option[Role] =
if(isRoleValid(role)) Some(newRole(role))
else None
final class NurseRequirement(role: Role, number: Int) //Parent
object NurseRequirement:
def isNumberValid(number: Int): Boolean = number > 0
//What should I do to validate the Role object??
我强烈怀疑你真的想要这样的伴生对象:
def from(s: String, n: Int): Option[NurseRequirement] =
if isNumberValid(n)
then Role.from(s).map(NurseRequirement(_, n))
else None
如果您遇到有更多此类可选子组件的情况,您可以使用 Option
上的 for
-comprehensions 摆脱嵌套的 if
,即类似于:
def from(s: String, n: Int) =
for
r <- Role.from(s)
m <- Option(n).filter(isNumberValid)
yield NurseRequirement(r, m)