2012-06-14 131 views
2

以下代碼打印NoMethodError。我不明白原因。儘管我調用的方法是私有的,但我從類內部調用它。不能使用類var訪問它是私有變量/函數嗎?我可以用Java來做到這一點。爲什麼我無法從班內訪問私人功能?

class Tester 
private 
    def func_pri 
    puts("From a private function") 
    end 

protected 
    def func_prot 
    puts("From a protected function") 
    end 

public 
    def func_pub 
    puts("From a public function") 
    end 

public 
    def caller(object) 
    object.func_pub 
    object.func_pri # This statement causes error 
    object.func_prot 
    end 
end 

o = Tester.new 
o.caller(o) 
+0

當您將對象用作參數時,您從範圍外調用此方法。使用發送,或在調用方法,做self.fun_pri – texasbruce

+0

這是什麼語言(哦,它是紅寶石)?爲什麼你通過函數? 認爲它調用其他一些它不能! – Malkocoglu

回答

5

你無法調用對象的私有方法,甚至沒有在self。刪除object.部分,然後通話將繼續self

如果你想調用一個私有方法,你可以隨時使用object.send(:func_pri)

Ruby在這些術語中與Java等語言完全不同。有關更多信息,您可能需要查看http://www.ruby-doc.org/docs/ProgrammingRuby/,章節'類,對象和變量','訪問控制'一節

+0

什麼是「自我」? –

+0

與java中的'this'類似。當你沒有爲方法指定一個接收者時,它會轉向自我(也就是說,self是隱式的接收者) –