我目前正在制作一个可以存储英语单词的类。我想让它尽可能安全(如果输入无效 - 返回错误消息),这就是我迷路的地方。我有这段存储英文单词的代码:
case class English_LT_Word private (word: String)
object English_LT_Word {
def apply(word: String) = new English_LT_Word(word)
def createNewWord(word: String): Either[String, English_LT_Word] = {
if (word.length > 0 && word.forall(x=>consonants.contains(x) || vowels.contains(x))) Right(apply(word))
else Left("'" + word + "'" + " is an invalid word")
}
}
在这个例子中,我可以像这样创建任何英文单词:
val english = English_LT_Word.apply("Awesome")
val english = English_LT_Word.createNewWord("Awesome")
在这里,我对使用什么感到困惑,但它并不漂亮。我该如何正确地做到这一点?将 .apply() 方法设为私有(private)是不可能的,因为(长话短说)编译器将不同步。我只想使用 .createNewWord() 方法来创建我的单词。有什么想法吗?
谢谢!! ^^
最佳答案
您可以使用 -Xsource:2.12
定义 2.12 或 2.11 下的自定义案例伴侣应用。
$ ~/scala-2.11.12/bin/scala -Xsource:2.12
cat: /usr/lib/jvm/jdk1.8.0/release: No such file or directory
Welcome to Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_181).
Type in expressions for evaluation. Or try :help.
scala> :pa
// Entering paste mode (ctrl-D to finish)
import scala.util._
case class Word private (text: String)
object Word {
def apply(s: String): Either[String, Word] =
if (s.nonEmpty) Right(new Word(s)) else Left("Empty word!")
}
// Exiting paste mode, now interpreting.
import scala.util._
defined class Word
defined object Word
scala> Word("")
res0: scala.util.Either[String,Word] = Left(Empty word!)
scala> Word("ok")
res1: scala.util.Either[String,Word] = Right(Word(ok))
关于Scala 私有(private)应用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51790659/