2017-10-17 36 views
0

爲什麼我可以通過Object#send(:private_method)調用私人方法?爲什麼我可以通過Object#send來調用私有方法,但不能直接調用上述方法?

Ruby的private關鍵字的目的是什麼?如果不阻止直接調用某些方法?

有沒有辦法可靠地防止對象能夠調用某些方法?

class Person 
    def say_hi 
    "hi" 
    end 

    private 
    def private_say_hi 
    "private hi" 
    end 
end 

me = Person.new 
me.say_hi 
#=> "hi" 

me.private_say_hi 
#Error: private method `private_say_hi' called for #<Person:0x00558df4b79a08> 

me.send(:private_say_hi) 
#=> "private hi" 
+0

設計接口時,可以使用私有方法指示方法不穩定,不應直接由對象使用。 –

+0

它沒有完全使用send方法,並且引發了一個警告消息,但是這裏是一個重寫send方法以防止訪問私有方法的例子:[link](https://stackoverflow.com/問題/ 20639857 /如何禁用-a-certain-method-in-ruby-being-being-being-being-the-the-the-console) – Pend

+0

你需要重寫很多東西... https:// stackoverflow .com/questions/5349624/how-to-call-methods-dynamically-based-on-name/26284769#26284769你可能可以做一個便宜的檢查來電者... –

回答

2
  • 我爲什麼可以調用通過對象#發送的私有方法(:private_method)?

仔細看你做了什麼:

me.send(:private_say_hi) 

在無處方法private_say_hi被稱爲形式:

me.private_say_hi 

這是爲什麼。不是很明顯嗎?

  • 如果不阻止直接調用某些方法,Ruby的私有關鍵字的目的是什麼?

正如定義所述。避免使用明確的接收者進行呼叫。

  • 有沒有辦法可靠地防止對象能夠調用某些方法?

使用undefundef_method,或remove_method取決於你的需要。

相關問題