2016-09-06 108 views
2

我對Ruby的瞭解是,私有方法不能用明確的接收方調用,即使是self在Ruby中調用的私有方法

class Private 
    private 
    def private_method(c) 
    puts '#{c}' 
    end 
end 

p = Private.new 
p.instance_eval{ private_method("private method called") } 

這是如何工作的?我們可以使用instance_eval來調用私人方法。請解釋

+3

您在這裏看不到明確的接收方,是嗎? –

+1

我很困惑你的問題。你說私人方法只能在沒有明確接收者的情況下被調用。你沒有明確的接收者就調用私有方法。那麼你很驚訝你可以調用一個沒有明確接收者的私有方法? –

回答

1

由於instance_evalp(意思是它是self)的上下文中執行該塊,並且現在調用private_method是一個帶有隱式接收器的調用。

1

Ruby允許你做很多「討厭」的事情,打破封裝或其他原則。

instance_eval運行該塊selfp。當你在實例中時,你顯然可以調用私有方法。你甚至可以用這種方式定義方法!

class A 
end 
a = A.new 
a.instance_eval{def value; 5; end} 
puts a.value # prints "5" 

這不是唯一的方法,你可以做到這一點。 send也允許撥打私人方法:

class A 
    private 
    def p 
    5 
    end 
end 
a = A.new 
puts a.send(:p) # prints "5" 
+1

是的,用紅寶石你可以打破所有的原則。沒有什麼是神聖的。 :) –

+0

我認爲'send'不應該被允許訪問私有方法。一切都可以通過發送來調用! – mhaseeb

+0

@mhaseeb:看看'public_send'。 –