가끔 Ruby에서 "?"가있는 메서드를 볼 수 있습니다. 그리고 "!" 예 :
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
그들의 목적이 무엇인지 궁금합니다. 그들은 단지 구문 설탕 코팅입니까?
가끔 Ruby에서 "?"가있는 메서드를 볼 수 있습니다. 그리고 "!" 예 :
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
그들의 목적이 무엇인지 궁금합니다. 그들은 단지 구문 설탕 코팅입니까?
답변:
가독성을 위해 "단지 설탕 코팅"이지만 공통된 의미가 있습니다.
!
영구적이거나 잠재적으로 위험한 변경을 수행합니다 . 예를 들면 :
Enumerable#sort
객체를 Enumerable#sort!
제자리에 정렬하는 동안 정렬 된 버전의 객체를 반환합니다 .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
이진 데이터입니까?" 처럼 보입니다 .
Array#clear
예를 들어를 참조하십시오 . 배열을 지 웁니다. 배열을 지우면 자연스럽게 변형됩니다. 그것에 대해 놀라운 것은 없습니다. 그 이름은 이미 명확하게 보여줍니다. ruby-forum.com/topic/176830#773946을 참조하십시오 .
물음표는 메서드가 부울을 반환 함을 나타냅니다. 여기에 이미 답변했습니다.
강타는 메서드가 객체 자체에서 작동 함을 나타냅니다. 여기에 이미 답변했습니다.
Ruby에서 ?
메서드는 부울을 반환하고 !
호출 된 객체를 수정 한다는 의미입니다 . 코드를 볼 때 가독성을 높이기 위해 있습니다.
-내가 생각하기에-대부분의 프로그래밍 언어와는 대조적으로 ...
Ruby, 메서드는 물음표 또는 느낌표로 끝날 수 있습니다.
관례 적으로 질문에 대답하는 메서드 (예 : Array # empty?는 수신자가 비어 있으면 true를 반환)는 물음표로 끝납니다.
관례 상 "위험한"방법 (예 : self 또는 인수를 수정하는 방법, exit! 등)은 느낌표로 끝납니다.
From : http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , 섹션 재미있는 메소드 이름
?
메소드를 술어 메소드라고합니다.
항상 그런 것은 아닙니다. 예를 들어 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합니다.
대신 연결하기 전에 복제해야합니다. 다행히 내 테스트 스위트가이 문제를 포착했지만 ..주의!