명령문이 작동하지 않는 경우 한 줄


192
<%if @item.rigged %>Yes<%else%>No<%end%>

이런 식으로 생각하고 있었습니까?

if @item.rigged ? "Yes" : "No" 

그러나 작동하지 않습니다. 루비는 ||=있지만 그 사용법을 잘 모르겠습니다.


어느 라인이 작동하지 않는지 확실하지 않습니다 (또는 둘 다?)
ymoreau

답변:


401

제거 if에서if @item.rigged ? "Yes" : "No"

삼항 연산자 양식 condition ? if_true : if_false


1
조건이 '?'로 끝나면 떨어 뜨릴 수 있습니까? 즉 조건이 @ customer.sales.present입니까? '?'를 떨어 뜨릴 수 있습니까? ... 걱정하지 마십시오. 내가 가지고있는 코드를 찾아서 테스트했습니다. 정답은 '아니요'
Jay Killeen

@JayKilleen 당신이 맞습니다. 루비는 영리한 트릭에 대한 모든이지만, 그건 영리 (:
니키타 리박

1
@NikitaRybak s/that/not that :)
Austin

180

Ruby에서 조건과 표현식 의 then일부 if는 표현식 구분 기호 (예 : ;개행 문자) 또는then 키워드 .

따라서이 모든 것이 작동합니다.

if @item.rigged then 'Yes' else 'No' end

if @item.rigged; 'Yes' else 'No' end

if @item.rigged
  'Yes' else 'No' end

Ruby에는 조건부 연산자도 있지만 완전히 불필요합니다. 조건부 연산자는 연산자이므로 C에 필요합니다. C에서는 if명령문이므로 값을 반환 할 수 없으므로 값을 반환하려면 값을 반환 할 수있는 무언가를 사용해야 합니다. 그리고 C에서 값을 반환 할 수있는 유일한 것은 함수와 연산자이며 만드는 것이 불가능하기 때문에if C에서 함수 연산자가 필요합니다.

그러나 루비에서는 if표현입니다. 실제로 모든 것이 Ruby의 표현식이므로 이미 값을 반환 할 수 있습니다. 조건부 연산자도 존재할 필요가 없습니다. 그것을 사용 혼자하자.

BTW : 끝에 물음표와 함께 질문을하는 데 사용되는 메소드의 이름을 지정하는 것이 일반적입니다.

@item.rigged?

이것은 Ruby에서 조건부 연산자를 사용할 때의 또 다른 문제를 보여줍니다.

@item.rigged? ? 'Yes' : 'No'

서로 가까이있는 여러 개의 물음표로 읽기가 어렵습니다.


74

다음과 같은 경우 한 줄 :

<statement> if <condition>

너의 경우:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged

14
또는"No" unless @item.rigged!
Veger

이 솔루션은 if 가 nil아니라 리턴하는 점에서 다릅니다 . 조건이 충족 되지 않으면 단일 행 if 또는 not 문이 반환 됩니다. 'Yes'item.riggednil
Pellmeister는

23

내가 아는 것에서

원 라이너 3 개

  1. a = 10 if <condition>

예:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

예:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

예:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

도움이 되길 바랍니다.


2
개 이것은 가장 좋은 대답입니다. 저는 세 가지 방법을 간결하게 대조합니다. 감사!
MrVocabulary

7

쉘과 C 단선 구성은 모두 작동합니다 (루비 1.9.3p429).

# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"

# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"

두 번째
예만


2

간단하게하기 위해 nil 인 경우 기본값으로 설정해야하는 경우 다음을 사용할 수 있습니다.

@something.nil? = "No" || "Yes"

1

당신이 사용할 수있는 ----

(@ item.rigged)? "예 아니오"

@ item.rigged가 true이면 '예'를 반환하고 그렇지 않으면 '아니오'를 반환합니다

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