2016-11-14 3 views
1
class Foo 
    @@first_time = true 

    def self.private_bar 
    if @@first_time 
     puts "Hi" 
    else 
     puts "Oi, you don't work here" 
    end 
    @@first_time = false 
    end 

    private_class_method :private_bar 

    public 
    def calling_private_method 
    self.class.send :private_bar 
    another_private_bar 
    end 
end 

f=Foo.new 
f.calling_private_method 
f.class.send :private_bar 

출력은 다음과 같이해야 하는가? 이것은 버그 여야합니다. 그렇지 않으면 정보 캡슐화에 대한 중요한 위반입니다. 맞습니까?이것은 루비의 캡슐화를 위반하는 간단한 방법입니까?</p> <pre><code>Hi NoMethodError: private method `private_bar' </code></pre> <p>그러나, 출력은 다음과 같습니다 :</p> <pre><code>Hi Oi, you don't work </code></pre> <p>왜 이런 일이

+1

http://stackoverflow.com/a/896633/10396 – AShelly

답변

2

당신은 당신이

String = Array 
puts String.new.inspect 
#=> [] 

또는

class Fixnum 
    def +(b) 
    self-b 
    end 
end 

puts 1+2 
#=> -1 

을 작성할 수 있습니다 언어에서 무엇을 기대 하는가?

더 심각한 점은 루비에서는 거의 아무것도 금지되어 있습니다 : 실험을하고 루비의 내부 동작을 배우는 것이 더 쉬워집니다. 경우에 따라보다 간결한 코드를 작성하거나 더 엄격한 언어로 재생하기가 더 어렵거나 불가능한 "마법의"동작을 얻을 수 있습니다.

예를 들어, 개인 메서드를 호출 할 수는 있지만 일반적인 구문은 사용할 수 없습니다.

2

왜 이런 일이 발생합니까? 이 버그는 그렇지 않으면 정보 캡슐화에 대한 중요한 위반이 될 수 있습니다.

Object#send을 사용하면 표시 여부에 관계없이 메소드를 호출 할 수 있습니다. 그처럼 간단합니다.