2016-11-14 20 views
1
class Foo 
    @@first_time = true 

    def self.private_bar 
    if @@first_time 
     puts "Hi" 
    else 
     puts "Oi, you don't work here" 
    end 
    @@first_time = false 
    end 

    private_class_method :private_bar 

    public 
    def calling_private_method 
    self.class.send :private_bar 
    another_private_bar 
    end 
end 

f=Foo.new 
f.calling_private_method 
f.class.send :private_bar 

これは、ルビのカプセル化に違反する簡単な方法ですか?出力はこのようなものでなければなりません

Hi 
NoMethodError: private method `private_bar' 

ただし、出力は次のようになります。

Hi 
Oi, you don't work 

ですが、なぜでしょうか?これはバグでなければなりません。それ以外の場合、情報のカプセル化に重大な違反があります。

+1

http://stackoverflow.com/a/896633/10396 – AShelly

答えて

2

はあなたが

String = Array 
puts String.new.inspect 
#=> [] 

または

class Fixnum 
    def +(b) 
    self-b 
    end 
end 

puts 1+2 
#=> -1 

を書き込むことができます言語から何を期待していますか?

もっと深刻なことに、Rubyではほとんど何も禁止されています。実験してRubyの内部動作を学ぶのが簡単です。場合によっては、より簡潔なコードを書くことや、より厳しい言語で再現するのが困難または不可能な「魔法のような」挙動を得ることが可能になります。

この例では、プライベートメソッドを呼び出すことはできますが、通常の構文は使用できません。

2

どうしてですか?これはバグでなければなりません。そうでなければ、情報のカプセル化に重大な違反があります。

Object#sendを使用すると、可視性にもかかわらずメソッドを呼び出すことができます。そのような単純な。

関連する問題