? :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 enda ? 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보다 작다면, 그것은 변하지 않을 것입니다.