루비에서 C# 스타일 열거를 어떻게 사용할 수 있습니까?
-
03-07-2019 - |
문제
루비에서 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
그들은 이름으로 만 구성된 물체와 비슷합니다.