답변:
when "toyota", "lexus"
, 나는 얻는다 : unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. 그러나 이것을 when "toyota","lexus"
쓰면 작동합니다. 유일한 차이점은 쉼표 뒤에 공백입니다.
or
또는 ||
(가) 때문에 여기에 when
그것의 권리가 아닌 하나의 식별자에 쉼표로 구분 된 일련의 표현식을합니다. 당신이 있다면이 때문에 when a or b
,이는 동등한로한다인지 분명하지 않다 when a, b
또는 when (a or b)
표현식을 평가 후자있는, a or b
경우에 그것을 던지기 전에 먼저. 문맥에 따라 행동을 바꾸는 토큰을 언어가 처리하는 것이 더 놀랍고 다루기 쉽지 않으며, 그때 or
오른쪽에 실제 표현 을 사용할 수 없습니다 .
루비의 "splat"또는 flattening 구문을 활용할 수 있습니다.
이것은 when
너무 잘 자란 절을 만듭니다 -당신이 올바르게 이해한다면 가지 당 테스트 할 약 10 개의 값이 있습니다-내 의견으로는 조금 더 읽을 수 있습니다. 또한 런타임시 테스트 할 값을 수정할 수 있습니다. 예를 들면 다음과 같습니다.
honda = ['honda', 'acura', 'civic', 'element', 'fit', ...]
toyota = ['toyota', 'lexus', 'tercel', 'rx', 'yaris', ...]
...
if include_concept_cars
honda += ['ev-ster', 'concept c', 'concept s', ...]
...
end
case car
when *toyota
# Do something for Toyota cars
when *honda
# Do something for Honda cars
...
end
또 다른 일반적인 방법은 해시를 디스패치 테이블로 사용하는 것입니다. 각 값의 키 car
와 실행하려는 코드를 캡슐화하는 호출 가능한 객체 인 값이 있습니다.
when
줄을 위한 뛰어난 솔루션 . 공유해 주셔서 감사합니다.
논리를 데이터에 넣는 또 다른 좋은 방법은 다음과 같습니다.
# Initialization.
CAR_TYPES = {
foo_type: ['honda', 'acura', 'mercedes'],
bar_type: ['toyota', 'lexus']
# More...
}
@type_for_name = {}
CAR_TYPES.each { |type, names| names.each { |name| @type_for_name[type] = name } }
case @type_for_name[car]
when :foo_type
# do foo things
when :bar_type
# do bar things
end