2013-03-07 2 views
0

상수를 재정의하려고하면 Ruby는 경고 만 표시하지만 오류는 표시하지 않습니다. 그래서 항상 루비에서 상수를 재정의 할 수 있습니까? Ruby 상수를 다시 정의하고 send() 메소드를 통해 개인 메소드에 액세스 할 수있게하는 이유는 무엇입니까?

Const = 12 
puts Const 
#only an warning: already initialized constant Const 
Const = 14 
puts Const #Displays 14 
class MyClass 
private 
    def priv 
     puts 'In private method' 
    end 
end 
obj = MyClass.new 
#Error: private method `priv' called for #<MyClass:0x7f2cfda21738> (NoMethodError) 
#obj.priv 
#but this is fine! 
obj.send(:priv) 

는 루비와 같은 디자인의 뒤에 어떤 근거가 있습니까 :

또한 클래스의 private 메소드는 전송 방법을 사용하여 호출 할 수 있습니다? 이것들은 상수와 액세스 지정자에 대한 기본 아이디어를 각각 위반하지 않습니까?

이러한 디자인을 실제로 사용할 수 있습니까? 몇 가지 예가 있으면 좋을 것입니다!

참고 : Ruby의 상수 및 개인 방법에 관해 많은 질문/토론을 볼 수 있지만 그 이유에 대해서는 찾지 못했습니다.

+0

간단하다고 생각합니다. Ruby는 Java가 아닙니다. 액세스 지정자는 가이드 라인이며 돌로 설정된 규칙은 아닙니다. – Linuxios

+0

@Linuxios 자바 또는 다른 언어는 잊어 버리고 영어 단어 * 'constant'* & * 'private'* 만 생각하면됩니다. Ruby의 이러한 디자인이이 두 단어의 해석을 침해하지 않습니까? 나는 루비가 영어를 할 수있는 한 가까이하려고 노력한다는 것을 읽었다. 루비에 대한 인기있는 루비 책 [왜 루비에 대한 안내 (http://mislav.uniqpath.com/poignant-guide/book/)]는 실제로 루비가 독자적으로 생각하거나 읽는 방식에 가깝다는 아이디어로 시작됩니다 마음 ... – Curious

+1

루비는 상수가 영원히 잠겨있는 등의 규칙을 시행하는 현학적 언어가 되려고하지 않습니다. 그렇다면 우리가 사용할 수 있어야하는 유일한 상수는 과학 계산기에서 발견 할 수있는 것입니다. 대신에, 상수는 우리가 변경하고 싶지 않은 것들이지만 우연히 실수하면 경고를 야기한 코드를 수정할 수 있도록 Ruby가 경고합니다. 프로그래머로서, Ruby가 예외를 발생시키고 코드를 중단하거나 그렇게하지 않고 자동으로 재 할당을 무시하는 것은 좋지 않습니다. 그래서 현재의 동작은 멋지게 작동합니다. –

답변

3

send에 대한 대답은 오히려 간단합니다. 반사를 사용하면 모든 베팅이 해제됩니다. 다른 대부분의 언어와 다를 바 없으며, 예를 들어 리플렉션을 사용하여 Java의 액세스 제한을 우회 할 수도 있습니다.

그리고 상수의 경우, 잘, 을 수행하면 경고 메시지가 나타납니다. 너 당신이하지 말아야 할 일을하고있다. 그러나 Ruby는 자신이하는 일을 알고 있다는 것을 신뢰하는 언어입니다. 그것은 당신의 방식으로 얻을 수 없습니다. 당신이 발에서 자신을 쏘고 싶다면, 당신은 그것을 할 수 있어야합니다. Ruby에서 할 수있는 많은 악의적 인 것들이 있습니다. 상수를 재정의하는 것은 그렇게 중요하지 않습니다.