상수를 재정의하려고하면 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의 상수 및 개인 방법에 관해 많은 질문/토론을 볼 수 있지만 그 이유에 대해서는 찾지 못했습니다.
간단하다고 생각합니다. Ruby는 Java가 아닙니다. 액세스 지정자는 가이드 라인이며 돌로 설정된 규칙은 아닙니다. – Linuxios
@Linuxios 자바 또는 다른 언어는 잊어 버리고 영어 단어 * 'constant'* & * 'private'* 만 생각하면됩니다. Ruby의 이러한 디자인이이 두 단어의 해석을 침해하지 않습니까? 나는 루비가 영어를 할 수있는 한 가까이하려고 노력한다는 것을 읽었다. 루비에 대한 인기있는 루비 책 [왜 루비에 대한 안내 (http://mislav.uniqpath.com/poignant-guide/book/)]는 실제로 루비가 독자적으로 생각하거나 읽는 방식에 가깝다는 아이디어로 시작됩니다 마음 ... – Curious
루비는 상수가 영원히 잠겨있는 등의 규칙을 시행하는 현학적 언어가 되려고하지 않습니다. 그렇다면 우리가 사용할 수 있어야하는 유일한 상수는 과학 계산기에서 발견 할 수있는 것입니다. 대신에, 상수는 우리가 변경하고 싶지 않은 것들이지만 우연히 실수하면 경고를 야기한 코드를 수정할 수 있도록 Ruby가 경고합니다. 프로그래머로서, Ruby가 예외를 발생시키고 코드를 중단하거나 그렇게하지 않고 자동으로 재 할당을 무시하는 것은 좋지 않습니다. 그래서 현재의 동작은 멋지게 작동합니다. –