2010-11-27 2 views
12

물음표가있는 메서드는 진위 (예 : 숫자)를 반환하여 무언가가 참임을 나타내거나 true 자체를 반환해야합니까?루비에서, 물음표로 끝나는 메소드 이름에 대해 진실성은 관용적입니까?

예를 들어 Ruby 표준 라이브러리 나 Rails에서 사용되는 진실성의 예가 있습니까?

배경 : 누군가가 정수 사실 나타 내기 위해 반환하고, nil 거짓 대표되는, an answer to a separate questionString#int? 방법을 썼다. 다른 사용자는 부울을 반환하지 않는 것에 놀랐습니다.

+3

당신이 규칙을 다음되지 않은 인용 예, 그것은 실제 부울을 반환해야합니다. –

+0

ㅎ, 나는 그 토론을보고, 그 반응이이 질문으로 이어질 지 궁금해했다. :-) 좋은 캐치 @ Andrew Grimm –

+0

@ 아담 : 답이 아니라 주석이 아닌가요? (대개 반대편에있는 사람들에 대해 불평합니다!) –

답변

6

그것은 반환 ?로 끝나는 방법에 대한 보통 다음 중 하나입니다 true 또는 false하지만 체계적인 아니며 핵심 방법을지지 않습니다.

코어 클래스의 예는 Numeric#nonzero?하는 결코 반환 true 또는 false이다.

42.nonzero? # => 42 

도서관 Set 너무 add?delete? 있습니다. Enumerable#one?nil 또는 false을 반환하여 개수가 0보다 큰 경우를 구별합니다.

비슷한 예로는 true 또는 false 만 반환하는 비교 연산자 (<, >, ...)가 있습니다. 여기서 다시 예외는 두 모듈이 관련되지 않은 경우 대신 nil를 반환합니다 Module의 운영을 위해 존재합니다

Array > Enumerable # => false 
Array > Fixnum  # => nil 
+0

Heckle은 내부적으로 [Ternary logic] (http://en.wikipedia.org/wiki/Ternary_logic)을 사용합니다. - IIRC'true '는 메소드가 heckle-proof이고,'false'는 그렇지 않다는 것을 의미하고'nil' 헤클을 줄 필요가 없다는 뜻입니다. –

8

? Ruby의 메소드 이름에이 메소드가 true 또는 false를 리턴한다는 것은 관용적이다. Object#nil?이 좋은 예입니다. 사실, Object는 진실성 검사에 대한 좋은 예를 많이 가지고 있습니다.

2

질문에 대한 두 가지 답이있다, 둘 다 유효합니다

기술적으로, 단지 nil이 아닌 또는 true 값으로, 조건부 테스트를 수행 할 때 거짓 부울로 false 또는 nil 값 행위를 반환 아무것도 사실로 작용합니다. 그래서, 문제의 방법은 뭔가가 정수인지를 알고 싶어하는 대부분의 시간 동안 올바르게 작동 할 것입니다.

그러나 스타일 적으로 '?'로 끝나는 방법입니다. 부울 true 또는 false 중 하나만 반환해야합니다.

문제의 메서드는 실제로 우리의 기대치와 잘 일치하지 않으며 POLS ("가장 덜 놀랄만 한 원리")를 실패합니다. 부울 값이 반환 될 것으로 기대할 수 있고 정수 또는 없음을 얻을 수 있기 때문입니다. 예기치 않은 nil 또는 Fixnum 값으로 실패 할 때 코드에서 불쾌한 놀라움이 발생할 수 있습니다.

유효한 방법이지만 좋은 방법이 아니며 코드 검토에서 사용했을 것입니다. 그렇다면 코드 관리를 향상 시키거나 손상시킬 수있는 미묘한 점에 대해 별도로 논의하게됩니다.하지만 이는 완전히 다른 논의입니다.

2

?을 제거하기 위해 문제의 메서드 이름을 변경했습니다. 이는 질문에 답하는 것이 중요하지 않습니다. ?에서 끝나는 핵심 기능을 통해 스캔 한 결과, 반환 된 데이터 또는 없음을 발견 한 것은 Set의 add?delete? 메소드였습니다.

+0

답변에서 내 의견을 삭제했습니다. 틀렸어. 수업을 가져 주셔서 감사합니다. –

관련 문제