문제

루비에서 C# 스타일 열거를 모방하는 가장 좋은 방법을 알고 싶습니다.

도움이 되었습니까?

해결책

구체적으로, 나는 변수가 주어진 값 세트에 대해 논리적 테스트를 수행 할 수 있기를 원합니다. 예는 창의 상태입니다 : "최소화, 최대화, 닫히고, 열기"

값에 매핑하기 위해 열거가 필요한 경우 (예 : 0으로 최소화되어 있고, 동일하게 100 등을 최대한 활용해야합니다), 나는 다음과 같은 값에 기호 해시를 사용합니다.

WINDOW_STATES = { :minimized => 0, :maximized => 100 }.freeze

Nate가 말한 것처럼 동결은 우연히 미래에 물건을 깨는 것을 막습니다. 이 작업을 수행하여 무언가가 유효한지 확인할 수 있습니다.

WINDOW_STATES.keys.include?(window_state)

또는 값이 필요하지 않고 '멤버십'을 확인 해야하는 경우 배열이 정상입니다.

WINDOW_STATES = [:minimized, :maximized].freeze

이렇게 사용하십시오

WINDOW_STATES.include?(window_state)

키가 문자열 (예 : ROR 앱의 '상태'필드)이 되려면 문자열 배열을 사용할 수 있습니다. 나는 많은 레일 앱에서 항상 이것을합니다.

WINDOW_STATES = %w(minimized maximized open closed).freeze

이것은 거의 레일입니다 validates_inclusion_of 유효성 검사기는 다음을 위해 구축 된 목적입니다.

개인 메모 :

나는 포함 된 입력을 좋아하지 않습니까? 항상, 그래서 나는 이것을 가지고 있습니다 (.in? (1, 2, 3) 케이스로 인해 복잡합니다.

class Object

    # Lets us write array.include?(x) the other way round
    # Also accepts multiple args, so we can do 2.in?( 1,2,3 ) without bothering with arrays
    def in?( *args )
        # if we have 1 arg, and it is a collection, act as if it were passed as a single value, UNLESS we are an array ourselves.
        # The mismatch between checking for respond_to on the args vs checking for self.kind_of?Array is deliberate, otherwise
        # arrays of strings break and ranges don't work right
        args.length == 1 && args.first.respond_to?(:include?) && !self.kind_of?(Array) ?
            args.first.include?( self ) :
            args.include?( self )
        end
    end
end

이렇게하면 입력 할 수 있습니다

window_state.in? WINDOW_STATES

다른 팁

그것은 똑같지는 않지만 종종 이런 종류의 해시를 만들 것입니다.

STATES = {:open => 1, :closed => 2, :max => 3, :min => 4}.freeze()

해시를 얼리면 실수로 내용을 수정하지 못하게됩니다.

또한 존재하지 않는 것에 액세스 할 때 오류를 제기하려면 Defualt Proc를 사용하여이를 수행 할 수 있습니다.

STATES = Hash.new { |hash, key| raise NameError, "#{key} is not allowed" }
STATES.merge!({:open => 1, :closed => 2, :max => 3, :min => 4}).freeze()

STATES[:other] # raises NameError

루비가 진정한 열거를지지한다고 생각하지 않지만 여전히 사용 가능한 솔루션이 있습니다.

열거와 루비

루비에서 열거를 정의하는 가장 쉬운 방법은 일정한 변수가있는 클래스를 사용합니다.

class WindowState
  Open = 1
  Closed = 2
  Max = 3
  Min = 4
end

다른 사람들이 말했듯이 수업이나 해시를 만드는 것은 효과가있을 것입니다. 그러나 루비해야 할 일은 사용하는 것입니다. 기호. 루비의 기호는 결장으로 시작하여 다음과 같이 보입니다.

greetingtype = :hello

그들은 이름으로 만 구성된 물체와 비슷합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top