2016-09-27 2 views
3

Java에서 제공되는 Ruby에서 LinkedList를 구현하려고합니다. 내가 자바에서 이것을 구현하는 일반적인 방법은 LinkedList 라 불리는 클래스와 LinkedList의 각 객체가 Node라는 객체라는 Node라는 개인 내부 클래스가 있습니다.Ruby에서 개인 내부 클래스를 구현하는 방법

class LinkedList 
    private 
    class Node 
    attr_accessor :val, :next 
    end 
end 

노드 클래스를 외부 세계에 노출시키고 싶지 않습니다. 그러나 루비에서이 설정으로,이를 사용하여 LinkedList의 클래스 외부에서 개인 노드 클래스의 개체에 액세스 할 수 -

node = LinkedList::Node.new 

내가 아는 한, 루비 1.9, 우리는 개인 일정으로 노드를 지정하는 private_constant 방법을 사용할 수 있습니다. 그러나 이것이 이것이 이것을 달성하는 올바른 방법인지 궁금합니다. 또한 LinkedList 클래스 외부에 Node 객체를 만들 수 있는데, private로 선언 된 이유는 무엇입니까?

+2

루비에서 유리 집에 살기 때문에 항상 개인 물건을 보는 사람들에게 익숙해 져야합니다. 당신이 관리 할 수있는 최선의 방법은 사람들이 아이디어를 얻는 것을 피하는 공손한 방법으로 "제발하지 말라"는 말을하는 것입니다. – tadman

+0

사실, 질문에 답하거나 문제를 해결하는 대답을 받아 들여야합니다. 대답의 왼쪽에 녹색 체크 표시가 있는지 확인하십시오. –

답변

7

왜 private로 선언 되었더라도 LinkedList 클래스 외부에 Node 객체를 만들 수 있습니까?

루비 상수는 "일반"가시성 수정 기호를 무시합니다. 항상 섹션에 상관없이 공개됩니다. 비공개로 설정하려면 private_constant을 사용하십시오. 이 세련되지 않은 디자인이나 뭐든지 부르지 만 그게 그 방법입니다.

또한 private_constant이더라도 개인 정보가 거의 없음을 의미합니다. 기본적으로 목록에서 상수를 숨기고 (LinkedList.constants) 직접 해결 (LinkedList::Node) 만 숨 깁니다. 이름을 알고 있다면 에 액세스 할 수 있습니다.

class LinkedList 
    class Node 
    attr_accessor :val, :next 
    end 

    private_constant :Node 
end 

LinkedList.const_get('Node') # => LinkedList::Node 
+0

'node = LinkedList :: Node.new'와 같이'private_constant'와 같은 것을 할 수 없다고 생각합니다. –

+0

@ BartekGładys : 그래, 그게 내가 말한거야. –

+0

좋아, 예쁘다. :) –

3

내가 세르지오의 대답은 충분 것을 알고 있지만, 그냥 질문에 대답 :

방법 또한 가 함께 갈 수

루비 개인 내부 클래스를 구현하기를 :

class LinkedList 
    class << self 
    class Node 
    end 

    def some_class_method 
     puts Node.name 
    end 
    end 
end 

LinkedList.some_class_method  # accessible inside class 
#=> #<Class:0x007fe1e8b4f718>::Node 
LinkedList::Node     # inaccessible from outside 
#=> NameError: uninitialized constant LinkedList::Node 
LinkedList.const_get('Node')  # still inaccessible 
#=> NameError: uninitialized constant LinkedList::Node 

물론

LinkedList.singleton_class::Node 
#=> #<Class:0x007fe1e8b4f718>::Node 

Node에 액세스 할 수있을 것 그리고 그것은 또한 LinkedList의 싱글 클래스 상수 내에서 사용할 수 있습니다 :

LinkedList.singleton_class.constants 
#=> [:Node, :DelegationError, :RUBY_RESERVED_WORDS, :Concerning] 

나는 보통 private_constant를 사용하지만이하는 또 다른 방법입니다 개인 수업.

+0

네, 멋지 네요,하지만 이것도 쉽게 우회 할 수 있습니다 :'LinkedList.singleton_class :: Node # => # :: Node' :) –

+0

또한'LinkedList.singleton_class.constants # => [[: Node]' –

+0

@SergioTulentsev 올바른지 다시 한번 루비에 "접근 할 수 없다"는 것을 확인합니다 :) –

관련 문제