2017-10-17 34 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取决于你的需要。

相关问题