2013-03-16 19 views
5

nesne veya kayıttaki bir dizi eylemi gerçekleştirmek için uygun yapı vardı: BenScala analog "nesne ile başlarım ... sonunu" eski paslı Pascal da (kısayol uygulayarak yöntem erişimi)

with obj do 
begin 
    methodCall 
    otherMethodCall 
    ... 
end 

{ 
    import obj._ 
    callObjMethod(x, y) 
    objVal.doSomething() 
    ... 
} 
: obj geçti kapatma geçerli kapsamda olduğunu ve bunun davrandım sanki scala benzer bir şey dokunmaya çalışırken, ama bir şey kafama :)

eksik, bir şekilde bu tür etkiye ulaşmak için mümkün mü

Ama özelleştirilmiş sözdizimi gibi:

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

aslında sezgisel ben yes daha no daha ama merak kesin bilmek istediğini hissediyorum.

cevap

11

Bir olasılık tap yöntemdir:

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

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

veya zenginleştirme

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

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

Ben makrolarla hatta arzu sözdizimi almak (ve yükünü önlemek mümkün olmalıdır düşünüyorum işlev nesneleri oluştururken), ancak bunu başka birine bırakacağım.

+0

bu oldukça düzgün – Arg

+0

Altçizgi _.callObjMethod 'nesnesine başvuruyor nasıl alınamıyor. Nasıl? – dmitry

+1

Ben buna [Kestrel] (http://combinators.info/#kestrels), RichAny denmez, çünkü bu işlem kombinatorlerden gelir. –

12

Bunu mu demek istediniz?

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

// later as long as file is in scope 

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

Sadece kapsamında nesnenin metotlarını getirmek için import anahtar sözcüğünü kullanabilirsiniz.

+0

Evet, bunu kastediyorum, ve bu soruda bu şekilde yazılmıştır. – dmitry

+0

Bu en iyi cevap gibi gözüküyor (öbürü ilginç ve çekilmeye değer). – sourcedelica

+0

bu en iyi cevap değil, çünkü bu teknik başlangıçtan beri tartışılmıştı ve nasıl davranacağımı öğrenmek için ** bir şey yapmayı denedim. – dmitry