목차
Ruby의 and와 &&는 다르다
Ruby로 프로그램을 짜다보면 반드시 밟게되는 지뢰가 있습니다. 바로 or 과 ||, 혹은 and 와 && 연산자의 우선순위가 달라서 발생하는 일입니다.
💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.
Ruby로 프로그램을 짜다보면 반드시 밟게되는 지뢰가 있습니다. 바로 or
과 ||
, 혹은 and
와 &&
연산자의 우선 순위가 달라서 발생하는 일입니다. 약간 차이가 있어도 비슷한 순서였다면 문제가 되지 않겠지만, 하필 둘 사이에는 =
을 비롯한 할당 연산자가 끼어있기에 실수를 하게 되는 경우가 많습니다.
다음 코드를 실행하면 두 변수에는 어떤 값이 지정될까요?
a = false or true
b = false || true
정답은 다음과 같습니다.
a # false
b # true
위 예제에서 사용된 연산자 우선 순위는 높은 것부터 낮은 순서로 ||
, =
, or
입니다. 따라서 위 코드는 다음의 순서로 실행됩니다.
(a = false) or true
b = (false || true)
이는 두 연산자가 애초에 다른 목적을 띄고 있기 때문입니다.
||
, &&
은 우리가 일반적으로 생각하는 논리 연산을 위한 연산자입니다. 따라서 일반적인 불 대수의 논리 연산을 위해서는 ||
, &&
연산자를 사용하는 것이 좋습니다.
반면 or
과 and
는 흐름 제어(control flow)를 위해 사용합니다. Bash를 사용해보셨다면 call_first && call_second
같은 식으로 흐름 제어를 해본 경험이 있으실텐데요, 루비의 or
, and
는 이러한 목적의 연산자입니다. 때문에 이 연산자들은 다른 연산자들보다 가장 낮은 우선 순위에 있죠.
이를 활용한 간단한 예제는 다음과 같습니다. do_something
메소드가 실패했다는 의미로 false
를 리턴한다고 가정하겠습니다.
# 예제 1
result = do_something or "failed"
# 예제 2
result = do_something || "failed"
# 각 구문의 실행 순서는 다음과 같습니다.
(result = do_something) or "failed"
result = (do_something || "failed")
result
에 do_something
값의 실행 결과를 할당하고, 만약 이 실행 결과가 실패라면 "failed" 라는 문자열을 출력하는 목적의 코드입니다. result
변수에 값을 할당하는 것과, 할당된 값을 보고 결과를 출력하는 두 개의 동작을 하나의 syntax로 묶은 것이죠.do_something
을 실행하고, 만약 실패했다면 result
값 자체에 "failed"을 할당하는 것이 목적입니다. 이는 result
변수에 값을 할당하는 하나의 동작밖에 수행하지 않습니다.이렇게 엄연한 차이가 있지만 얼핏 보기에는 헷갈리는 것이 사실입니다. 따라서 일반적인 경우에서는 예제 1과 같은 코드 보다는 아래와 같이 명시적으로 작성하는 것이 헷갈리지 않을 것입니다.
result = do_something
puts "failed" unless result
관련된 글
Rails와 GitHub Actions에 커버리지 레포트를 달아보자
이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.
Rails Global ID로 전역 객체 식별하기
Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.
Ruby on WebAssembly: 살짝 맛보기
Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.
본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
© 2011 - 2024 Hoerin Doh, All rights reserved.
작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.