[String,Unit] - 它是惯用的吗?是否有更惯用的类型?

时间:2017-01-06 13:42:09

标签: scala either

add成功的回报是什么?

目前我返回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")

    }
...
}

1 个答案:

答案 0 :(得分:1)

我认为更惯用的方式是:

  • 为您的例外情况创建自定义异常类(可论证)
  • 在add方法中返回[Throwable,Map],在右侧返回修改后的地图

顺便说一句,你可以使用codereview.stackexchange来代码审查需要:)

编辑:正如@massg指出的那样,此时,Try [Map]正好具有[Throwable,Map]的语义,并且确实更适合