2017-01-06 16 views
2

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") 

    } 
... 
} 
+0

논쟁의 요점이지만, 저는 이것을 모델링합니다. 'Future [Unit]'로 실패 사례에 대한 응용 프로그램 예외로 미래에 실패했습니다. – maasg

+0

도 참조하십시오 : http://stackoverflow.com/questions/40283042/futureeitherapperror-optionuser-in-scala/40284496#40284496 – maasg

+0

@maasg 최근에 [미래] [Unit]'https://lustforge.com/2016에 대해 읽었습니다./04/12/future-unit-and-stupid-scala-tricks/ – jhegedus

답변

1

내가 더 관용적 방법이있을 거라고 생각 :

  • 은 (논증) 당신의 예외 경우에 사용자 정의 예외 클래스를 작성
  • 추가 방법에 돌려 주어 어느 [Throwable를,지도,

Btw는 오른쪽에 수정 된지도를 반환, 당신은 물론, 코드 검토가 필요에 대한 codereview.stackexchange을 사용할 수 있습니다 :

편집 : @massg가 지적했듯이, [Map]은 [Throwable, Map] 중 하나의 의미를 정확히 가지고 있습니다. 실제로는 더 많은 weel이 적합합니다.

+0

감사합니다. – jhegedus

+2

'[Throwable, T] == Try [T]' – maasg

+0

@jhegedus maasg 코멘트는 실제로 많은 의미가 있습니다! 나는 대답을 편집 할 것이다 – C4stor