? :
Ruby에서 조건부 연산자 ( ) 는 어떻게 사용됩니까?
예를 들어, 이것이 맞습니까?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
? :
Ruby에서 조건부 연산자 ( ) 는 어떻게 사용됩니까?
예를 들어, 이것이 맞습니까?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
답변:
그것은 인 삼원 연산자 및는 (괄호가 필요하지 않은) C처럼 작동한다. 다음과 같이 작동하는 표현식입니다.
if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this
그러나 Ruby에서는 우선 순위 문제를 제외하고 === if
식이기도합니다 . 둘 다 표현입니다.if a then b else c end
a ? b : c
예 :
puts (if 1 then 2 else 3 end) # => 2
puts 1 ? 2 : 3 # => 2
x = if 1 then 2 else 3 end
puts x # => 2
첫 번째 경우 괄호가 필요합니다 (그렇지 않으면 Ruby는 puts if 1
추가 정크 가 있다고 생각하기 때문에 혼란 스럽 습니다). 그러나 마지막 문제에서는 언급되지 않았으므로 필요하지 않습니다.
여러 줄에서 가독성을 높이기 위해 "long-if"형식을 사용할 수 있습니다.
question = if question.size > 20 then
question.slice(0, 20) + "..."
else
question
end
nil
및 false
입니다. 실제로는 그리 평범하지 않습니다.
puts true ? "true" : "false"
=> "true"
puts false ? "true" : "false"
=> "false"
puts (true ? "true" : "false")
괄호로 작은 편집 . 그렇지 않으면 작업 순서가 명확하지 않습니다. 내가 이것을 처음 읽었을 때 나는 그것을 읽었을 때 혼란스러워졌고 부울을 반환 (puts true) ? "true" : "false"
할 것으로 예상 puts
되어 문자열 값이되었습니다.
ERB를 사용하면 Rails에 있음을 알 수 있습니다. 그렇다면, truncate
당신을 위해 일을 해줄 내장 된 도우미 를 고려 하십시오 :
<% question = truncate(question, :length=>30) %>
@pst는 큰 대답을했지만 루비에서는 삼항 연산자가 Perl 및 C와 달리 여러 줄에 쓸 수있는 구문이 정확하도록 한 줄에 작성되었다는 것을 언급하고 싶습니다.
(true) ? 1 : 0
일반적으로 루비는 여러 줄로 나누려고 할 때 오류를 발생 시키지만 \
줄 끝에 줄 연속 기호를 사용할 수 있으며 루비는 행복 할 것입니다.
(true) \
? 1 \
: 0
이것은 간단한 예이지만 코드를 깔끔하게 배치하기 때문에 더 긴 줄을 다룰 때 매우 유용 할 수 있습니다.
연산자를 마지막 줄에 두어 줄 연속 문자없이 삼항을 사용할 수도 있지만 마음에 들지 않거나 권장하지는 않습니다.
(true) ?
1 :
0
조건부 테스트 및 / 또는 결과가 길어질수록 코드를 읽는 것이 실제로 어렵다고 생각합니다.
혼란 스럽기 때문에 삼항 연산자를 사용하지 말라고 언급 한 의견을 읽었으므로 무언가를 사용하지 않는 나쁜 이유입니다. 같은 논리로 정규 표현식, 범위 연산자 ( ' ..
'및 알 수없는 "플립 플롭"변형)를 사용해서는 안됩니다 . 올바르게 사용하면 강력하므로 올바르게 사용하는 법을 배워야합니다.
왜 괄호를 넣었
true
습니까?
OP의 예를 고려하십시오.
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
조건부 테스트를 래핑하면 테스트가 시각적으로 분리되므로 더 읽기 쉽습니다.
<% question = (question.size > 20) ? question.question.slice(0, 20)+"..." : question.question %>
물론, 공백을 합리적으로 추가하여 전체 예제를 훨씬 더 읽기 쉽게 만들 수 있습니다. 이것은 테스트되지 않았지만 아이디어를 얻습니다.
<% question = (question.size > 20) ? question.question.slice(0, 20) + "..." \
: question.question
%>
또는 더 관용적으로 쓰면 :
<% question = if (question.size > 20)
question.question.slice(0, 20) + "..."
else
question.question
end
%>
가독성도 나빠진다는 주장은 쉬운 일 question.question
이다.
true
습니까?
true
실제로 true
또는로 평가되는 표현식이 무엇인지에 대해 앉아 있기 때문 입니다 false
. 삼항 문장은 시각적 노이즈로 빠르게 전환되어 가독성을 감소시켜 유지 보수성에 영향을 미치기 때문에 시각적으로 구분하는 것이 좋습니다.
운영자가 플레이어의 ID가 1인지 확인하고 결과에 따라 적의 ID를 설정하는 간단한 예
player_id=1
....
player_id==1? enemy_id=2 : enemy_id=1
# => enemy=2
그리고 나는 매우 유용한 주제에 관한 게시물을 발견했습니다 .
enemy_id = player_id == 1 ? 2 : 1
?
코드 condition ? statement_A : statement_B
는
if condition == true
statement_A
else
statement_B
end
question=question[0,20]
그것이 20보다 작다면, 그것은 변하지 않을 것입니다.