2016-10-09 9 views
0

私はhttp://www.markthomas.info/blog/92自己参照でこれの代わりに自己なぜですか?

からセルフタイプの結果が

trait SpellChecker { 
    self: RandomAccessSeq[char] => 
    ... 
} 

のように何であるかを理解し、ここにself代わりのthisを使用することをお勧めしている理由私は理解していませんでしたか...!?また、私がselfの代わりにasfdと書くと、私もコンパイラエラーが出ません。だから私は「自己」がすべてであるとは確信していません。後で特性のメソッドの1つにオブジェクトのようなselfを使用することは可能であるとは思われません。

答えて

3

selfは、SpellCheckerインスタンスのエイリアスです。これはネストされた構造(クラスなど)がある場合に便利です。あなたがあなたのエイリアスを使用することができ、外側の要素を参照したいのであれば

this = Bar here 
self = Foo here 

trait Foo { 
    self => 

    override def toString : String = "Foo here" 

    class Bar { 
    def print() : Unit = { 
     println(s"this = $this") 
     println(s"self = $self") 
    } 
    override def toString : String = "Bar here" 
    } 
} 

val foo = new Foo {} 
val bar = new foo.Bar() 
bar.print() 

出力:これを考えてみましょう。 thisを使用するとエイリアスがないことを意味します。this : Example =>を意味しています。「エイリアスは必要ありません。例と混合してください」asfdiLikeFriesと同じくらいうまくいけば、あなたのエイリアスに名前を付けることができます。 selfは多少の慣習です。

+0

私は実際には2つのものを混ぜ合わせています。「自己」の自己参照エイリアスと相続処方?あなたの例では、あなたは相続処方を一切与えなかったのですか?あなたはちょうど 'this'のエイリアスですか? – Make42

+0

正しい。それはそんなに混合するものではありませんが、これらはあなた自身の注釈で行うことができる2つのことです:1) 'this'のエイリアスを作成し、2)その特性がいくつかの必要なタイプ)。どちらか一方、または両方を行うことができます。あなたの質問は主にエイリアス部分について語られました。 – alextsc

1

この特定のケースでは、thisと名前を変更するのは意味がありません。入れ子の場合には、外側の名前をthisに変更し、それをネストされたテンプレート/オブジェクトにアクセスすると意味があります。