2017-05-03 1 views
2

null으로 변수를 인스턴스화하지 않고 대신 Option을 사용하여 많은 스칼라 코드를 변경했습니다. 예를 들어 이전에 다음과 같이 입력했습니다.스칼라 작업 옵션

var cxn: RepositoryConnection = null 
cxn = repo.getConnection() 
//do something with the connection, then close it 
cxn.close() 

이제 내 코드는 다음과 같이 보입니다.

var cxn = None : Option[RepositoryConnection] 
cxn = Some(repo.getConnection()) 
//do something with the connection, then close it 

이제는 RepositoryConnection 유형과 연결된 메소드를 호출하려고 할 때의 문제가 있습니다. cxnRepositoryConnection 객체가 아닌 Option[RepositoryConnection] 때문에, 내가 null를 사용하여 때

value close is not a member of Option[org.openrdf.repository.RepositoryConnection] 

지금,이 작업이 잘 작동 : 나는 시도 :

cxn.close() 

이 오류를 참조하십시오. Option을 사용하고 있는데 close() 메서드를 호출하는 쉬운 방법이 있습니까?

+0

를 볼 처리하는 방법에 따라 시도 할 수 있습니다 = repo.getConnection()'이 경우? 진짜 문제는 var를 사용하고 null/None으로 설정 한 다음 나중에 실제 값을 넣는 것입니다. 'Option'을 사용하면이 점이 향상되지 않습니다. – puhlen

+0

그 이유는 내 코드의 설계로 인해 cxn이 전역 변수가되어야하고 나중까지 설정되지 않기 때문입니다. 사실 repo 객체는 cxn이 초기화 될 때 아직 생성되지 않았으며, 나는 이것이 내가 작업하고있는 기술 때문에 필요하다고 생각한다. – hayfreed

+3

옵션을 원하지 않는다면 문제에 대한 설명으로 게으른 발을 원하게됩니다. – pedrofurla

답변

1

당신의 변수가 Option[Something]이기 때문에, 당신이 대신 귀하의 경우에는 instanceOfSomethingOpt.map(realInstance => realInstance.methodOfInstance())

instanceOfSomethingOpt.methodOfInstance()

를 호출 할 수 없습니다, 그것은

cxn.map(realConnection => realConnection.close()) 

//or to make it shorter 
cxn.map(_.close()) 
1

당신은 정말 Optionapi에 모습을 제공해야 할 것 .

cxn.map(_.close()) 

은 편도입니다. close()이 표시 될 수 있습니다.

cxn.foreach(_.close()) 

은 다른 방법으로, close()이 많이 수행하지 않으면 (부작용).

2

몇 가지 옵션이 있습니다. (말장난 대해 죄송합니다.) 가장 정직하고는 ... 아마

cxn.map(_.close()) 

입니다하지만 아마 당신은 cxnNone 경우 다른 뭔가를 할 필요가있다. 그럼 당신은 ... 같은 뭔가를 할 수

또는
cxn.fold(logger.reportStatus())(_.close()) 
+0

OP가'.close' 리턴을 신경 쓰지 않는 것 같기 때문에'.foreach'가 아마도 가장 적합 할 것입니다. 또한,'.fold' 대신'.map (stuff) '을 사용할 수 있습니다.getOrElse (otherStuff) ' – pedrorijo91

+0

@ pedrorijo91, 좋은 지적. '.getOrElse()'는 이해하기 쉽지만, 나는 그 간결성을 위해'.fold()()'를 선호하는 경향이 있으며 더 많은 사람들이 알아야 할 관용구라고 주장 할 수 있습니다. 필자가 정말로 포함시켜야 할 것은 모든 다양한 솔루션을 찾을 수있는 [ScalaDocs 페이지 링크] (http://www.scala-lang.org/api/current/scala/Option.html)입니다. – jwvh

0
val cxn = Some(repo.getConnection()) 
for (c <- cxn) yield { 
    //do something with the connection 
    c.close() 
} 

당신은 어느 쪽과의 getConnection을 포장하거나`발 CXN 오류가 왜 사용할 수 없습니다 http://blog.xebia.com/try-option-or-either/