2017-03-21 8 views
7

ここでは説明できないような面白いケースがあります。プライベートセッターは「一種の」プライベートだと思われますが、時には例外があります。定期的なプライベートメソッドは、プライベートセッターに異なる動作をするように見える:なぜプライベートセッターは他のプライベートメソッドと異なった動作をしますか?

class TestClass 
    def do 
    self.foo = :bar # fine 
    self.baz  # error 
    end 

    private 

    def foo=(other) 
    @foo = other 
    end 

    def baz 
    end 
end 

TestClass.new.do 

上記のコードは、明示的なselfで呼び出されているにもかかわらず、@fooうまく設定します。 #bazはプライベートメソッドなので、#bazを呼び出すことができません。

これは何ですか?

+1

通常、私は、接頭辞 'self'を使用せずに' baz'を呼ぶだろう、そしてそれは、このインスタンスで動作するはずです。しかし、私はそれがあなたの直接の質問に答えるものではないことに気づきます – moveson

答えて

4

プライベートセッターは特別です:

foo = :bar 

は、ローカル変数fooに割り当て、それはメッセージfoo=を送信しません。

セッターは、明示的な受信者なしでは呼び出せない唯一のものではありません。 [email protected][email protected]!~[][]=+-*/%&|^**<<>>======~!~!=<><=>=<=>など、私は忘れてしまったかもしれませんが、明示的な受信者なしでは呼び出すことはできません。そして、+=<<=などのようなものがあります。

すべての例外が必要です。残念ながら、いくつかの例外は例外です。

からprivateためのルールを変更することが提案されている

だけを除き、明示的なレシーバなしで呼び出すことが[本当に複雑である例外のこの長いリスト、まだ完了していない]ことができます。

にのみ明示的な受信機や受信機などのリテラル特殊変数selfせずに呼び出すことができます。

定義のすべての現在のプロパティを保持します(最も重要なのは、解析時に静的に決定できるということです)。

But so far, nothing has come of it.

1

セッターメソッドを使用するときにselfを使用しない場合は、値をローカル変数に代入します。 More details。以下のコードで

は、私はFOOへの割り当てからselfを削除した、とあなたはセッターがB/C @fooを使用されていない見ることができますnilです:

ほとんどどのよう
def do 
    foo = :bar # fine 
    baz  # error 
    puts @foo # prints nil 
    puts foo # prints 'bar' 
    end 
1

privateが動作しており、ルビーのprivateprotectedメソッドの主な違いです。クラスのインスタンスでprivateメソッドを呼び出すことはできません。そのクラス内であっても、protectedが可能です。そうでない場合は、彼らがすべてで呼び出すことができなかったので

関連する問題