"If do-this"와 "do-this"에 대한 루비 관용구가 간단한 명령처럼 있습니까?
예를 들어, 저는 현재
object.method ? a.action : nil
else 절을 비워 두는 것이지만, 끝에 nil을 지정하지 않아도되는 좀 더 관용적 인 방법이있을 것 같습니다. (또는이 경우 여러 줄의 코드를 작성하는 것이 낭비라고 생각합니다.
"If do-this"와 "do-this"에 대한 루비 관용구가 간단한 명령처럼 있습니까?
예를 들어, 저는 현재
object.method ? a.action : nil
else 절을 비워 두는 것이지만, 끝에 nil을 지정하지 않아도되는 좀 더 관용적 인 방법이있을 것 같습니다. (또는이 경우 여러 줄의 코드를 작성하는 것이 낭비라고 생각합니다.
답변:
일반적으로 Ruby에서는 삼항 연산자가 거의 필요하지 않습니다. C에 있기 때문에 당신이 C에 필요한 이유이며, if
여러분이 값을 반환 할 그렇다면, 성명이다 가 표현이다 삼항 연산자를 사용합니다.
루비에서는 모든 것이 표현식이고, 문장 이 없으므로 삼항 연산자를 거의 불필요하게 만듭니다. 언제든지 교체 할 수 있습니다.
cond ? then_branch : else_branch
와
if cond then then_branch else else_branch end
따라서 귀하의 예에서 :
object.method ? a.action : nil
다음과 같다
if object.method then a.action end
@Greg Campbell이 지적했듯이 이는 후행 if
수정 자 형식 과 동일합니다.
a.action if object.method
또한, 루비의 부울 연산자 이후 단지 반환하지 true
나 false
,하지만 마지막에 평가 식의 값, 당신은 제어 흐름을 위해 사용할 수 있습니다. 이것은 Perl에서 가져온 관용구이며 다음과 같습니다.
object.method and a.action
cond ? a : b
는보다 짧습니다 if cond then a else b end
. 그만으로도 11 개의 문자를 절약 할 수 있습니다. ;-)
?:
보다 삼항 연산자 ( )를 선호합니다 if/then/else/end
. 더 일반적이고 분명히 더 간결합니다."
Greg의 대답이 가장 좋지만 기록을 위해 C보다 훨씬 더 많은 표현식과 문은 Ruby에서 동일하므로 a.action if o.m?
다음과 같은 작업도 수행 할 수 있습니다.
object.method? && a.action
당신은 쓰거나 (a; b; c) if d
심지어
(a
b
c
) if d
또는 그 문제에 대해 : (x; y; z) ? (a; b c) : (d; e; f)
루비에는 하나의 문이나 표현 만 허용되는 상황이 없습니다.
result = (<expression> && <true value>) || <false value>
value = 1
result = (value == 1 && 'one' ) || 'two'
result #=> 'one'
설명 : value == 1 && 'one'# => 마지막 표현식 결과를 반환하고 값은 1이므로 섹션이 평가되고 'one'을 반환합니다.
value = 0
result = (value == 1 && 'one' ) || 'two'
result #=> 'two'
설명 : value! = 1 및 'and'표현식은 평가되지 않지만 instad는 'or'표현식을 사용하고 'two'를 반환합니다.
동일한 라인에서이를 수행 할 수있는 또 다른 방법은 다음과 같습니다.
if object.method; a.action end
이것은 세미콜론을 사용하여 표현식을 종료하기 때문에 Rubocop에 의해 나쁜 스타일로 간주되지만, 끝에 if 문을 붙이는 것보다 일부 조건에서 더 읽기 쉽습니다. 마지막에 if 문을 간과하는 것이 더 쉬우 며 조건이 참이 아닌 경우 항상 무언가를 반환하고 싶지는 않습니다 (삼항 연산자로 강제 실행 됨).
좀 더 장황하고 rubocop 친화적 일 수도 있습니다.
if object.method then a.action end