2013-03-16 6 views
5

Nel vecchio arrugginito Pascal c'erano conveniente costrutto per eseguire una sequenza di azioni su un oggetto o di record:Scala analogica a "con l'oggetto do begin ... end" (abbreviare accesso metodo)

with obj do 
begin 
    methodCall 
    otherMethodCall 
    ... 
end 

Sono cercando di toccare qualcosa di simile in scala, ma qualcosa manca nella mia testa :)

e 'possibile ottenere in qualche modo tale effetto, come se fosse in obj nell'ambito corrente di chiusura passato e si comportava come questo:

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

Ma nella sintassi personalizzate come:

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

intuitivamente sento che è più no di yes ma la curiosità vuole sapere con certezza.

risposta

11

Una possibilità è il metodo tap:

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

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

o dopo l'uso di arricchimento

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

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

Penso che con le macro si dovrebbe anche essere in grado di ottenere la sintassi desiderata (e di evitare il sovraccarico di creando gli oggetti funzione), ma lo lascerò a qualcun altro.

+0

questo è abbastanza pulito – Arg

+0

Impossibile ottenere come underscore diventa riferimento all'oggetto in '_.callObjMethod'. Come? – dmitry

+1

Lo chiamerei [Kestrel] (http://combinators.info/#kestrels), non RichAny, perché l'operazione proviene dai combinatori. –

12

Intendi questo?

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

// later as long as file is in scope 

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

si può semplicemente utilizzare la parola chiave import per portare i metodi dell'oggetto portata.

+0

Sì, voglio dire questo, e questo è scritto nella domanda a proposito. – dmitry

+0

Questa sembra la migliore risposta (anche se l'altra è interessante e vale la pena fare upvoting). – sourcedelica

+0

questa non è la risposta migliore, solo perché questa tecnica è stata messa in discussione sin dall'inizio, e ho cercato di scoprire come comportarsi come **. – dmitry

Problemi correlati