"!"의 목적은 무엇입니까? 그리고 "?" 메소드 이름 끝에?


답변:


160

가독성을 위해 "단지 설탕 코팅"이지만 공통된 의미가 있습니다.

  • 로 끝나는 메서드는 !영구적이거나 잠재적으로 위험한 변경을 수행합니다 . 예를 들면 :
    • Enumerable#sort객체를 Enumerable#sort!제자리에 정렬하는 동안 정렬 된 버전의 객체를 반환합니다 .
    • Rails에서 ActiveRecord::Base#save저장에 실패하면 false를 반환 ActiveRecord::Base#save!하고 예외를 발생시킵니다.
    • Kernel::exit스크립트를 종료 Kernel::exit!하고 즉시 종료하여 종료 처리기를 우회합니다.
  • ?boolean으로 끝나는 메서드 는 코드 흐름을 문장처럼 더욱 직관적으로 만듭니다. if number.zero?"숫자가 0 인 경우"처럼 읽지 if number.zero만 이상하게 보입니다.

당신의 예에서, name.reverse반대의 문자열로 평가는하지만, 후에 name.reverse!라인이 수행하는 name변수는 실제로 포함 반전 된 이름입니다. name.is_binary_data?" name이진 데이터입니까?" 처럼 보입니다 .


22
한 가지 중요한 점은 해당하는 비 뱅 방법이있는 경우에만 뱅 방법이 있어야한다는 것입니다. 강타는 방법의 "더 놀라운"버전과 "덜 놀라운"버전을 구별하는 데 사용됩니다. 방법이 하나만있는 경우 구별 할 필요가 없으며 이름을 강하게해서는 안됩니다. Array#clear예를 들어를 참조하십시오 . 배열을 지 웁니다. 배열을 지우면 자연스럽게 변형됩니다. 그것에 대해 놀라운 것은 없습니다. 그 이름은 이미 명확하게 보여줍니다. ruby-forum.com/topic/176830#773946을 참조하십시오 .
Jörg W Mittag

2
Ruby Style Guide 에 따르면 @ JörgWMittag가 언급 한 내용에 추가 : 잠재적으로 위험한 메서드의 이름 (예 : self 또는 인수를 수정하는 메서드, exit! (exit와 같은 종료자를 실행하지 않음) 등)은 다음으로 끝나야합니다. 위험한 방법의 안전한 버전이있는 경우 느낌표 .
Tod Birdsall 2015 년

2
항상 그런 것은 아닙니다. 예 : Ruby Array # concat docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat . 심하게 태울 수있는 곳은 MyActiveRecordModel.column_names.concat (...)과 같습니다. 대신 연결하기 전에 복제해야합니다.
wintondeshong


8

Ruby에서 ?메서드는 부울을 반환하고 !호출 된 객체를 수정 한다는 의미입니다 . 코드를 볼 때 가독성을 높이기 위해 있습니다.


5

-내가 생각하기에-대부분의 프로그래밍 언어와는 대조적으로 ...

Ruby, 메서드는 물음표 또는 느낌표로 끝날 수 있습니다.

관례 적으로 질문에 대답하는 메서드 (예 : Array # empty?는 수신자가 비어 있으면 true를 반환)는 물음표로 끝납니다.

관례 상 "위험한"방법 (예 : self 또는 인수를 수정하는 방법, exit! 등)은 느낌표로 끝납니다.

From : http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , 섹션 재미있는 메소드 이름


1
또한로 끝나는 ?메소드를 술어 메소드라고합니다.
Waseem

1

항상 그런 것은 아닙니다. 예를 들어 Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat 입니다.

심하게 화상을 입을 수있는 곳은 다음과 같습니다 MyActiveRecordModel.column_names.concat([url]). MyActiveRecordModel과 관련된 나중에 호출은 MyActiveRecordModel에 대한 'url'열을 찾고 throw합니다.

대신 연결하기 전에 복제해야합니다. 다행히 내 테스트 스위트가이 문제를 포착했지만 ..주의!

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