Что вернуть на успех в add
?Либо [String, Unit] - это идиоматично? Есть ли более идиоматический тип для этого?
В настоящее время я возвращаю Unit
, есть ли более идиоматический способ?
Я имею в виду, что Either[String, Unit]
не чувствует себя хорошо, потому что Right
предназначен для возврата значения, так как он имеет параметр типа.
Метод может быть неудачным или успешным, однако, когда он завершается с успехом, нет ничего, чтобы вернуться, поэтому я просто возвращаю Right()
. Интересно, что такое идиоматический способ описания такой ситуации?
Что было бы хорошего типа для представления этой ситуации?
import scala.collection.immutable.HashMap
import scala.concurrent.ExecutionContext
object UUID{
def apply():UUID= UUID(java.util.UUID.randomUUID().toString)
}
case class UUID(id:String) case class Ref[T](c:Class[T], id:UUID) {
override def equals(that:Any)=id.equals(that)
override def hashCode()=id.hashCode()
}
case class RefVal[T](r:Ref[T],v:T)
package container {
import scala.concurrent.Future
trait MapContainer[T] {
var map: HashMap[Ref[T], RefVal[T]] = HashMap[Ref[T], RefVal[T]]();
private[container] def add(rv: RefVal[T]): Future[Either[String, Unit]] = Future
{
if (!map.contains(rv.r)) {
map = map updated(rv.r, rv)
Right()
} else Left("add, class already exists with this uuid :" + rv.r.c)
}
private[container] def notExposed=println("cannot run this from outside package 'model'")
def delete(r:Ref[T]) : Future[Either[String,Unit]]= Future {
if (map.contains(r))
{
map = map - r
Right()
}
else Left(r+"element not found")
}
...
}
Это спорный вопрос, но я бы эту модель как «Будущее [Unit]», в противном случае в будущем будет исключение приложения в случае сбоя. – maasg
см. Также: http://stackoverflow.com/questions/40283042/futureeitrapperror-optionuser-in-scala/40284496#40284496 – maasg
@maasg Недавно я прочитал это о 'Future [Unit]' https://lustforge.com/2016/04/12/future-unit-and-stupid-scala-tricks/ – jhegedus