2013-03-16 13 views
5

w starym zardzewiałym Pascal były wygodne konstrukt wykonać sekwencję działań na obiekcie lub rekordu:Scala analogowo „z obiektu do begin ... end” (pominięcie dostępu metoda)

with obj do 
begin 
    methodCall 
    otherMethodCall 
    ... 
end 

jestem próbując dotknąć czegoś podobnego w Scala, ale czegoś brakuje w mojej głowie :)

Czy to możliwe, aby osiągnąć jakiś efekt taki, jakby obj było w bieżącym zakresie przeszedł zamknięcia i zachowywał się jak to:

{ 
    import obj._ 
    callObjMethod(x, y) 
    objVal.doSomething() 
    ... 
} 

Ale w niestandardowych składnia jak:

doWith (obj) { 
    callObjMethod(x, y) 
    objVal.doSomething() 
} 

intuicyjnie czuję, że to coś więcej niż yesno ale ciekawość chce wiedzieć na pewno.

Odpowiedz

11

Jedną z możliwości jest metoda tap:

def tap[A](obj: A)(actions: (A => _)*) = { 
    actions.foreach { _(obj) } 
    obj 
} 

tap(obj) (
    _.callObjMethod(x, y), 
    _.objVal.doSomething() 
) 

lub po użyciu wzbogacenie

implicit class RichAny[A](val obj: A) extends AnyVal { 
    def tap(actions: (A => _)*) = { 
    actions.foreach { _(obj) } 
    obj 
    } 
} 

obj.tap (
    _.callObjMethod(x, y), 
    _.objVal.doSomething() 
) 

myślę, że z makrami powinno nawet być w stanie uzyskać pożądany składni (i uniknąć napowietrznej tworzenie obiektów funkcji), ale zostawię to komuś innemu.

+0

To jest całkiem schludne – Arg

+0

Nie można uzyskać w jaki sposób podkreślenie staje się odniesieniem do obiektu w '_.callObjMethod'. W jaki sposób? – dmitry

+1

Nazwałbym to [Kestrel] (http://combinators.info/#kestrels), a nie RichAny, ponieważ jego działanie pochodzi od kombinatorów. –

12

Masz na myśli?

val file = new java.io.File(".") 

// later as long as file is in scope 

{ 
    import file._ 
    println(isDirectory) 
    println(getCanonicalPath()) 
} 

można po prostu użyć słowa kluczowego import przynieść metod obiektu w zakresie.

+0

Tak, mam na myśli to, i to jest napisane w pytaniu przy okazji. – dmitry

+0

To wydaje się najlepszą odpowiedzią (chociaż druga jest interesująca i warta przegrania). – sourcedelica

+0

to nie jest najlepsza odpowiedź, tylko dlatego, że ta technika jest od początku określona w pytaniu, a ja próbowałem dowiedzieć się, jak coś zrobić, aby zachowywać się ** jak to. – dmitry

Powiązane problemy