다른 것없이 루비 삼항 연산자


79

"If do-this"와 "do-this"에 대한 루비 관용구가 간단한 명령처럼 있습니까?

예를 들어, 저는 현재

object.method ? a.action : nil

else 절을 ​​비워 두는 것이지만, 끝에 nil을 지정하지 않아도되는 좀 더 관용적 인 방법이있을 것 같습니다. (또는이 경우 여러 줄의 코드를 작성하는 것이 낭비라고 생각합니다.


문맥에 따라 다르지만 때로는 더 조밀하고 간결한 것보다 본문에 한 줄만있는 if / while / begin 블록을 읽는 것이 더 우아합니다.
glenn jackman

답변:



139

일반적으로 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

또한, 루비의 부울 연산자 이후 단지 반환하지 truefalse,하지만 마지막에 평가 식의 값, 당신은 제어 흐름을 위해 사용할 수 있습니다. 이것은 Perl에서 가져온 관용구이며 다음과 같습니다.

object.method and a.action

7
삼항 연산자 cond ? a : b는보다 짧습니다 if cond then a else b end. 그만으로도 11 개의 문자를 절약 할 수 있습니다. ;-)
Markus

1
Ruby Style Guide 는 다음과 같이 설명합니다. " 구성 ?:보다 삼항 연산자 ( )를 선호합니다 if/then/else/end. 더 일반적이고 분명히 더 간결합니다."
Kurt Bourbaki

18

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)

루비에는 하나의 문이나 표현 만 허용되는 상황이 없습니다.


3

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'를 반환합니다.


1

동일한 라인에서이를 수행 할 수있는 또 다른 방법은 다음과 같습니다.

if object.method; a.action end

이것은 세미콜론을 사용하여 표현식을 종료하기 때문에 Rubocop에 의해 나쁜 스타일로 간주되지만, 끝에 if 문을 붙이는 것보다 일부 조건에서 더 읽기 쉽습니다. 마지막에 if 문을 간과하는 것이 더 쉬우 며 조건이 참이 아닌 경우 항상 무언가를 반환하고 싶지는 않습니다 (삼항 연산자로 강제 실행 됨).

좀 더 장황하고 rubocop 친화적 일 수도 있습니다.

if object.method then a.action end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.