2014-11-16 67 views
1

我有我的情況下類:如何改變功能方面

case class MyClass(param : String)(body : => Unit) { 

    def save(){ ... } 
    def mymethod(){ ... }  

    body 
    save 
} 

然後我想用這樣的:

MyClass("param"){ // this function can not see 'mymethod' --- 
    ...              | 
    mymethod() //           < 
    ... 
} 

是否有可能使功能「身體」能夠訪問'mymethod'(以及MyClass類的所有其他方法)?

回答

1

一般沒有。通常的方法來建立一個DSL是使用某種類型的「命令」的對象,或許與Free Monad

object MyClass { 
    sealed trait Command 
    case class CallMyMethod() extends Command 
    def myMethod() = liftF[Command, Unit](CallMyMethod()) 
} 
case class MyClass(param: String)(body: Free[Command, Unit]) { 
    ... 
    body.resume.fold({ 
    case CallMyMethod() => mymethod() 
    }, _ => {}) 
    ... 
} 

然後,你可以寫你的DSL「程序」使用for/yield語法:

import MyClass._ 
MyClass("param")({ 
    for { 
    _ <- myMethod() 
    a = someNonMyClassCall() 
    b <- someOtherMyClassMethod(a) 
    } yield {} 
}) 

請注意,外部類可以創建CallMyMethod對象(因爲它們位於伴侶對象上),但這很好,在「MyClass」實例「解釋」它們之前,它們「無意義」。

+0

Imm,謝謝你很多 – Hlib

2

你爲什麼要這樣?

我看到兩種可能性:

給你的 '身體' 功能的上下文參數:

case class MyClass(param : String)(body: MyClass => Unit) { 
    def mymethod() = println("MyClass.mymethod()") 
    body(this) 
} 

MyClass("test"){ ctx => 
    ctx.mymethod() 
} 

把你的效用函數MyClass的同伴對象:

object MyClass { 
    def mymethod() = println("MyClass.mymethod()") 
} 
case class MyClass(param : String)(body: => Unit) { 
    body 
} 

MyClass("test"){ 
    import MyClass._ 
    mymethod() 
} 
+0

j-keck,謝謝。 – Hlib