2016-11-14 65 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可讓您調用盡管方法可見的方法。就那麼簡單。