2017-10-17 2 views
0

Object#send(:private_method)을 통해 비공개 방법을 호출 할 수있는 이유는 무엇입니까?Object # send를 통해 private 메소드를 호출 할 수 있지만 직접 상기 메소드를 호출 할 수없는 이유는 무엇입니까?

특정 방법의 직접 호출을 막지 않으려면 Ruby의 키워드의 목적은 무엇입니까?

개체가 특정 메서드를 호출하지 못하도록 확실하게 방지 할 수 있습니까? (: private_method)

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 메서드를 완전히 사용하지 않고 경고 메시지를 표시하지만 다음은 private 메서드에 대한 액세스를 금지하는 send 메서드를 재정의하는 예제입니다. [link] (https://stackoverflow.com/ 질문/20639857/how-to-disable-a-certain-method-in-ruby-from-in-the-in-the-console) – Pend

+0

많은 것을 무시해야합니다 ... https : // stackoverflow .com/questions/5349624/how-to-call-methods-dynamic-on-their-name/26284769 # 26284769 호출자에 관해서 싼 체크를 할 수 있습니다 ... –

답변

2
  • 이유는 개체 # 보내기를 통해 private 메소드를 호출 할 수 있습니다? 주의 깊게 당신이 무슨 짓을했는지에

봐 : 아무데도 방법 private_say_hi는 형태라고하지 않습니다에서

me.send(:private_say_hi) 

: 왜

me.private_say_hi 

즉. 분명하지 않습니까?

  • 특정 방법의 직접 호출을 막지 않으려면 Ruby의 비공개 키워드의 용도는 무엇입니까?

정의와 마찬가지로 말합니다. 명시적인 리시버로 호출되지 않도록합니다.

  • 개체가 특정 메서드를 호출하지 못하도록 확실하게 방지하는 방법이 있습니까? 당신은 필요에

사용 undef, undef_method, 또는 remove_method가 따라.

관련 문제