2011-03-09 6 views
5

저는 스칼라에서 모든 훅의 간결한 문서를 찾고 있습니다. 후크는 프로그램 흐름에서 공통적 인 동작을 가로채는 모든 상황을 말합니다. 이러한 상황은 다음과 같습니다 : 메소드와 필드 스레드의 스칼라의 훅 패턴

  • , 혼합에

    • 클래스의 선언이나 특성
    • 액세스, 상속

    어디를 들어, 루비 배경에서 간다 예를 들어, method_missing은 존재하지 않는 메소드 호출을 가로채는 것을 허용합니다.

    스칼라에서는 이러한 후크를 사용할 수 있습니까?

    Matthias

  • +0

    관련 메모는 http://stackoverflow.com/questions/3105594/is-there-a-method-missing-in-scala도 참조하십시오. – VonC

    답변

    7

    스칼라 2.8 이하에서는 method_missing에 해당하는 항목이 없습니다. Scala 2.9 (개발 중)에서는 Dynamic 특성이 추가됩니다. 동적 특성을 선언하는 개체에 대한 알 수없는 메서드 호출은 컴파일러에서 자동으로 변환되어 대신 invokeDynamic을 호출합니다. 동적 타이핑 언어의 힘을 불필요한 경우 동적 타이핑의 성능 오버 헤드를 지불하지 않고 안전하고 정상적인 방법으로 얻는 것이 아이디어입니다. 또한 스칼라에서 동적 언어로 정의 된 객체를 호출 할 때 상호 운용성 문제를 단순화합니다. 스칼라의 새로운 행동 접선보다 다른

    은 크게 고전 상속을 통해, 또는 암시 적 변환을 통해 객체에 새로운 기능을 addiing에 의해 하나 이루어집니다.

    3

    아니요, 아닙니다. 정적 언어에서 aspect 지향 프로그래밍은 같은 목적으로 사용될 수 있습니다. Can I do Aspect Oriented Programming in Scala? 그러나 물론, "클래스 또는 특성의 선언"을 참조하십시오 "스레드의 혼합 인을 상속는"제어 흐름의 하지 부분입니다. 플러그인을 가로 채고 싶다면 대신 컴파일러 플러그인이 필요합니다.

    3

    스칼라 클로저를 사용하는 대신에 (이 때문에 정적 타이핑 및 편집에 편리하게 구현할 수 없습니다 대부분의) 얘기하고 후크의 유형을 장려하는 경향이있다.

    이것은 일반적인 행동의 유연성이 바람직 할 수있다 미리 알고 당신이 필요하지만 사용할 때 사용하기 매우 강력하고 쉽습니다. 예를 들어, 사람의 이름을 밖으로 인쇄하는 방법이 있다고 가정 :

    case class Name(first: String, last: String) { 
        def title = last + ", " + first(0).toUpper + "." 
    } 
    trait Familiar extends Name { 
        override def title = first + " " + last(0).toUpper + "." 
    } 
    
    def listing(names: Array[Name]) = names.foreach(name => println(name.title)) 
    
    val jd1 = new Name("John","Doe) 
    listing(Array(jd1)) // Prints Doe, J. 
    val jd2 = new Name("John","Doe") with Familiar 
    listing(Array(jd2)) // Prints John D. 
    

    하지만 당신이 정말로 많은 인쇄 이름을 변화 할 거라면, 당신은 더 나을 건물이야을한다는 점에서 :

    case class Name(first: String, last: String) { 
        def title = last + ", " + first(0).toUpper + "." 
    } 
    
    def listing(names: Array[Name], address: Name => String = _.title) = 
        names.map(address).foreach(println) 
    
    val jd = new Name("John", "Doe") 
    listing(Array(jd)) // Uses default, so prints Doe, J. 
    listing(Array(jd), n => n.first + " " + n.last(0).toUpper + ".") // Prints John D. 
    
    1

    스칼라에는 그런 것이 없습니다.

    또는, 더 정확하게 넣어, 정적 타이핑은 우리가 코드를 컴파일 할 때 무슨 일이 일어날 지 알 수 있도록. 이러한 후크는 런타임에 동작을 변경하여 정적 입력의 목적을 무효화합니다.

    에서 컴파일러 플러그인을 통해 시간을 컴파일하거나 클래스 로딩 할 때 클래스 로더를 통해 물건을 변경할 수 있습니다.