2012-11-14 5 views
0
스칼라 배우에서 수신 한 메시지의 유형을 감지의 일반적인 방법입니다

그러나스칼라 액터의 반응 구성을 어떻게 무시할 수 있습니까?

loop{ 
    react{ 
      case x: String => 
      } 
    } 

에 의해, 나는 우리가 우리가 메시지의 암시 적 로깅을 할 수 있도록 구성 반응의 구현을 재정의하는 방법을 알고 싶어 그 수신됩니다.

아래에 언급 된 유스 케이스를 구현하려고합니다. -> 1. 어떤 사례 클래스와도 메시지가 일치하기 전에 콘솔/파일에 메시지의 출현을 나타내는 로그 문을 작성하고 싶습니다. 2. println()/log4j 로깅을 통해 이러한 메시지를 명시 적으로 기록 할 수 있습니다. 그러나, 나는 보내거나받은 모든 메시지를 기록 할 스칼라 액터에 대한 일반 로거를 설계하려고합니다.

이와 관련하여 도움이 될 것입니다. 미리 감사드립니다.

+2

관련해서? http://stackoverflow.com/questions/13329535/implicitly-logging-messages-received-by-an-actor-in-scala – Brian

답변

1

먼저 Scala 배우 라이브러리가 Akka를 위해 사용되지 않습니다. 따라서이 답변은 매우 오래 도움이되지는 않을 것입니다. (다른 배우 라이브러리는 잠시 동안 계속 사용 가능할 것입니다. 사람들이 그것을 유지하기를 원한다면 영원히 오픈 소스이기 때문에).

어쨌든 react 메서드는 scala.actors.Actor으로 정의됩니다. 단순히 가져 오기를 실패하거나 자신의 것으로 숨길 수 있습니다. 자신의 무엇?

글쎄,이 방법은 단지 PartialFunction[Any,Unit] 걸립니다. 당신은 정말에만 일부 기능에 액세스 할 수

def react(pf: PartialFunction[Any,Unit]): Nothing = { /*how?;*/ Actor.react(/*what?*/) } 

, 당신은 당신이 원하는 것을 할 Actor.react로 연기해야 ​​: 그래서, 당신은해야한다. 따라서 pf을 로깅을 수행하는 PartialFunction으로 다시 묶어야합니다. 당신이 와서 조사받을 실제로 소비되지 않은 메시지를보고 싶다면 그래서 당신은

val qf = new PartialFunction[Any,Unit] { 
    def isDefinedAt(a: Any) = pf.isDefinedAt(a) 
    def apply(a: Any): Unit = { 
    log(a) // Maybe add more logic to know what a is 
    pf(a) 
    } 
} 

, 당신은 또한 isDefinedAt로 더 많은 작업을 수행 할 수 있습니다.

그래서, 확실히 충분히, 나는 희망, /*how?*/는 (생성) qf를 정의하기 위이며, /*what?*/qf입니다.

a이 사례 클래스인지 여부를 알고 싶다면 답을 (의도적으로) 할 수 없다는 것입니다. 사례 클래스는 일반적인 스칼라 (Scala) 기능 위에 구문적인 설탕 일뿐입니다. 당신이 타이핑하는 것을 막을 수 있습니다. 예를 들어, this question을 참조하십시오. 당신은 정말 멋진 얻고 싶은 경우에 copy가 같은 수와 종류의가있는 경우

case class M(i: Int) 
val a: Any = M(5) 

scala> a match { 
    case p: Product if p.getClass.getMethods.exists(_.getName=="copy") => println("Yes") 
    case _ => println("No") 
} 
Yes 

가 확인 :

그러나 그것은 copy 방법이 있는지 여부를 꽤 Product에 대한 패턴 매칭 가까이하고 확인 얻을 수 있습니다 매개 변수를 생성자로 사용합니다.

1
//Following is a code for a logReact Method that does the same thing as react but also logs the message received hope this works for you 
import scala.actors.Actor; 
import scala.actors.Actor._ 

trait ActorLogging extends Actor { 
    def logReact(handler: PartialFunction[Any, Unit]): Nothing = { 
     val handler2: PartialFunction[Any, Unit] = { 
      case x => 
       println("Inside Logs -- with message recieved -- " + x.toString); 
       handler.apply(x); 
     } 
     super.react(handler2) 
    } 
} 

class sumAct extends Actor with ActorLogging { 
    def act() { 
     loop { 
      logReact { 
       case a: Int => 
        println("Inside actor Sum Act Received the message -- " + a) 
        exit; 
      } 
     } 
    } 
} 

object ActorLog { 
    def main(args: Array[String]): Unit = { 
     var s: sumAct = new sumAct; 
     s.start(); 
     s ! 1.toInt; 
    } 
}