Öz-tip ek açıklamalarda bu ve ben arasındaki fark?


134

Çeşitli Scala literatüründe "this" ve bazılarını "self" kullanan bazı kendiliğinden tip ek açıklamaları görüyorum:

trait A { this: B => ... }
trait A { self: B => ... }

"Bu" veya "benlik" i kullanmak arasında gerçek bir fark var mı? Hangi ismi kullandığınız önemli mi? Bu kadar geçerli mi?

trait A { foo: B => ... }

Yanıtlar:


181

Her üç form da geçerlidir ve sınıfın Btürü olarak kabul edilen etkiye sahiptir .thisA

İlk iki varyant

trait A { self: B => ... }
trait A { foo: B => ... }

özellik olarak takma ad olarak self(sırasıyla foo) tanıtmak . Bu, bir iç sınıftan referansa erişmek için kullanışlıdır . Daha sonra , içinde iç içe bir sınıftan özelliğin referansına erişmek yerine kullanabilirsiniz . Misal:thisAthisselfA.thisthisA

class MyFrame extends JFrame { frame =>    
  getContentPane().add( new JButton( "Hide" ) {
    addActionListener( new ActionListener {
      def actionPerformed( e: ActionEvent ) {
        // this.setVisible( false ) --> shadowed by JButton!
        frame.setVisible( false )
      }
    })
  })
}

Üçüncü varyant,

trait A { this: B => ... }

için bir takma ad tanıtmaz this; sadece kendi tipini ayarlar.


Kendi tipine baktığım yol, özelliğin belirli bir tip alıp kod bloğunu döndürdüğünü bildirmesi, örneğin foo: B => {...}. Şimdi bu kıvrımlar elbette göz ardı ediliyor.
Koddaki

4
@Martin Odersky İki veya daha fazla özellik için kısıtlama eklemek mümkün müdür trait A { self: B, C => ... }?
Dmitry Bespalov

13
@DmitryBespalov: Evet, withanahtar kelimeyi kendi kendine yazılan ek açıklamada kullanabilirsiniz. Örneğintrait A { self: B with C => ... }
Dave

btw ayrıca _: B =>basitlik için takma olmayan dava için de yapabilirsiniz
Creos

17

Her thiszaman en içteki şablon tarafından tanımlanan nesneye atıfta bulunan bir fark vardır .

İfade this, bir şablonun veya bileşik türün ifade bölümünde görünebilir. Referansı çevreleyen en içteki şablon veya bileşik tip tarafından tanımlanan nesnenin kısaltmasıdır. Bu bir bileşik tipiyse, tipi thiso bileşik tipidir. Bu basit bir isim olan bir sınıf veya nesne tanım şablonu ise C , bu tür bir türü ile aynıdır C . this. (Scala Ref. §6.5)

Dolayısıyla, kendi türünüzü çağırırsanız foo, buna yine de başvurabilirsiniz this(tabii ki, iç şablonda değilseniz, bu durumda thistanımlanmış nesneye atıfta bulunmazsanız - ve şablonun kendi adını aynı adı yazın), ancak açıkçası tam tersi değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.