루비 : if variable vs if variable.nil?


11

나는 루비를 처음 접했고 모든 객체가 nil과 false 이외의 것이 사실이라는 것을 알았을 때 놀랐습니다. 0도 마찬가지입니다.

언어의 속성에 대한 좋은 점은 다음과 같이 쓸 수 있다는 것입니다.

if !variable
  # do stuff when variable is nil
end

더 노련한 루비 개발자 인 동료들은 .nil 대신 이것을 선택해야한다고 주장합니까? 이렇게 :

if variable.nil?
  # do stuff when variable is nil
end

그러나 나는 두 가지 이유 때문에 후자가 더 나은 옵션이라고 생각합니다. 1. 특히 객체 지향 및 메시지 교환이 모든 언어 인 Ruby와 같은 언어에서 더 객체 지향적이라고 생각합니다. 2. 내 견해로는 덜 컴팩트하더라도 더 읽기 쉽습니다.

여기서 "초보자"실수를 저지르고 있습니까?


4
nil을 테스트하고 있습니까? 아니면 거짓 가치?

나는 nil을 테스트하고 있습니다. 기본적으로 변수가 nil이면, 나는 무언가를한다 (또는하지 않는다)
Javier Holguera

3
nil을 테스트하는 경우 false에 대한 테스트가 해당 블록에 들어가기를 원하는 이유는 무엇입니까?

동의합니다. .nil을 선호하는 또 다른 이유로 지적 했습니까? 그러나 그들은 "variable do x"가 "variable.nil? do x"보다 관용적이라고 주장했으며 변수가 부울이 아님을 알고있을 때 바람직하다
Javier Holguera

답변:


17

당신이 의미하는 것을 쓰십시오. 당신이 쓰는 것을 의미하십시오.

다른 시험을 봅시다. .vowel?

if char == 'a'
   # do stuff
end

vs

if char.vowel?
   # do stuff
end

자, 이것들은 똑같은 일을하지 않습니다. 그러나 당신은 기대하는 경우가 char있을 수 있습니다 a또는 b그것을 작동합니다. 그러나 다음 개발자를 혼동시킬 것입니다-두 번째 블록은 char [eiou]도 있는 조건에 입력됩니다 . 그러나에 대해서는 a올바르게 작동합니다.

예, 그것은 경우입니다 nilfalse루비에서 유일하게 falsy 값입니다. 그러나에 대해 테스트 nil하여 테스트하는 nil || false경우 이는 의미가 아닙니다.

그것은 다음 개발자 (집 주소를 아는 미친 도끼 살인자)가 코드를 읽고 왜 false거기에 들어가야 하는지 궁금 하다는 것을 의미합니다.

의미 하는 바를 정확하게 전달하는 코드를 작성하십시오 .


3

다음을 고려하세요:

response = responses.to_a.first

이것은 responses또는 의 첫 번째 요소를 반환합니다 nil. 조건문 nilfalse우리가 쓸 수있는 것처럼 취급하기 때문에 :

response = responses.to_a.first
if response
  # do something ('happy path')
else
  # do something else
end

다음보다 더 읽기 쉽습니다.

if response.nil?
  # do something else
else
  # do something ('happy path')
end

if (object)패턴은 루비 코드에서 매우 일반적입니다. 또한 리팩토링으로 이어집니다.

if response = responses.to_a.first
  do_something_with(response)
else
  # response is equal to nil
end

Ruby 메소드는 nil기본적으로 리턴된다는 것을 기억하십시오 . 그래서:

def initial_response
  if @condition
    @responses.to_a.first
  else
    nil
  end
end

다음과 같이 단순화 할 수 있습니다.

def initial_response
  if @condition
    @responses.to_a.first
  end
end

그래서 우리는 더 리팩토링 할 수 있습니다 :

if response = initial_response
  do_something_with(response)
else
  # response is equal to nil
end

이제 돌아 오는 nil것이 항상 최선의 아이디어는 아니라고 주장 할 수 nil있습니다. 그것이 어디에서나 확인하는 것을 의미하기 때문입니다 . 그러나 그것은 또 다른 물고기 주전자입니다. 객체 "존재 또는 부재"에 대한 테스트가 빈번한 요구 사항이므로, 객체의 진실성은 루비의 유용한 측면이지만, 언어를 처음 접하는 사람들에게는 놀라운 일입니다.


2

루비는 느슨하게 입력 된 언어이기 때문에 if variable.nil?자연어처럼 읽을 수 있을뿐만 아니라 실수로 false값을 할당하고 if명령문에 빠지지 않도록 프로그래머를 보호 합니다.


1
원래 질문의 초기 의견이 잘못 되었습니까? "변수가 nil이거나 false 일 때해야 할 일"이어야합니까? 주석과 일치하지 않는 코드는 버그이므로 바로 버그가 있습니까?
gnasher729

옳은. 간단한 진실성 테스트는 논리 오류를 유발할 수 있습니다.
Greg Burghardt

0

관용적 unless variable으로 if !variable. 부정적 if진술은 종종 스키밍 할 때 부정을 놓치기가 더 쉬워 코드 냄새로 간주됩니다.

여기서 더 큰 그림은 nil이와 같은 검사 를하는 것도 약간의 코드 냄새라는 것입니다. 적절한 OO를 위해서는 이러한 종류의 검사가 필요하지 않도록 null 개체 패턴을 사용하십시오. http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/

무엇을해야하는지 개체에게 말하고, 무엇인지 묻지 마십시오. 이것은 때때로 묻지 말라고 알려져 있습니다.

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