2017-03-14 7 views
0

내 함수에서 반환 형식을 사용하여 개체 또는 문자열을 가져 오는 중 하나를 사용하려고합니다. 개체 인 경우이 개체에서 메서드를 호출하기 시작합니다. 문자열 인 경우에는 다른 곳에서 다른 함수를 호출하고 싶습니다. 나는 반환되는 것이 반환되는 객체가 아니기 때문에 끊기고 있습니다.이 객체는 "left"유형이며 "Left"유형에서 해당 객체를 "Player"유형으로 다시 가져올 수 없습니다. 내가 좋아하는 것. 이것은 가변 큐를 확장하고있는 오브젝트에 있습니다. 여기 다시 참조하거나 개체로 다시

def popCurrentAction : Either[Player, String] = { 
    val currentAction = this.dequeue 
    this.enqueue(currentAction) 

    if (playerMap.get(currentAction) != None) { 
    Left((playerMap.get(currentAction).get)) 
    } 
    else { 
    Right(currentAction) 
    } 
} 

내 함수 중 하나 "플레이어"개체를 반환하는 기능을 사용하려고 : 여기 내 ActionQueue 객체에있는 키를 기반으로지도에서 플레이어 오브젝트를 조회 내 기능입니다 또는 String.

def doMove = { 
    var currentAction = ActionQueue.popCurrentAction 
    if (currentAction.isLeft) { 
    var currentPlayer = currentAction.left 
    var playerDecision = currentPlayer.solicitDecision() // This doesn't work 

    println(playerDecision) 

    } 
    else { 
    // Do the stuff if what's returned is a string. 
    } 
} 

나는 나를 solicitDecision 함수를 호출하고 반환 무엇을 얻을 수 있도록 않는 .fold 기능을 사용하여 시도했다, 그러나 나는 직접 플레이어 객체를 사용하고 싶습니다. 확실히 이것은 가능합니다. 누군가 도울 수 있습니까?

var currentPlayer = currentAction 
    var playerDecision = currentPlayer.fold(_.solicitDecision(), _.toString()) 
    // This is close but doesn't give me the object I'm trying to get! 
    println(playerDecision) 
+0

''solicitDecision'의 리턴 타입은 무엇입니까? 'currentPlayer.fold (...)'에서 무엇을 얻을 것으로 기대하십니까? – danielnixon

+0

내부에 객체가 없기 때문에 'Either'에서 객체를 가져올 수 없습니다. – ziggystar

답변

2

당신은, 그냥 "이 작동하지 않습니다"지고있어 어떤 오류 언급하지 않은, 당신이 게시 한 코드를 컴파일 및 테스트하기에 충분 완료되지 않았습니다. 컴파일러가 실패 할 때 currentPlayer 유형은 무엇입니까?

그렇다면 코드를 리팩토링하는 것이 좋습니다.

+0

"solicitDecision이 [Player, String] 중 하나의 멤버가 아니기 때문에 불평합니다." currentPlayer는 [Player, String] 유형 중 하나이며 solicitDecision은 Player 클래스의 메서드입니다. – shutch

+1

아,'.left'와'.right' 메쏘드는 여러분이 생각하는 것과 다르다. 그들은 '어느 쪽이나'의 왼쪽/오른쪽 _ 투영을 만듭니다. 그들은 추출자가 아닙니다. 이를 위해서는'currentAction.left.get'이 필요합니다. 이것은 실행 가능하지만 Scala 스타일이 좋지 않습니다. – jwvh

2

대소 문자를 구별하고 동시에 항목을 추출하는 가장 좋은 방법은 패턴 일치를 사용하는 것입니다. 또한

def doMove = { 
    val currentAction = ActionQueue.popCurrentAction 
    currentAction match { 
    case Left(currentPlayer) => 
     val playerDecision = currentPlayer.solicitDecision() 
     println(playerDecision) 
    case Right(string) => 
     println(string) 
    } 
} 

주 내가 val 대신 var을 사용하는 것이 : 귀하의 경우

, 그 대략 다음과 같은 코드가 될 것이다. 변경할 계획이없는 변수가 있으면 val 스타일이 좋습니다 (대략 읽기 전용 변수가됩니다).