[ruby] Ruby 메소드에 느낌표가 사용되는 이유는 무엇입니까?

루비에서 일부 메소드에는 해당 객체가 포함되어 있는지 묻는 ?질문과 같은 물음표 ( ) include?가 있습니다. 그러면 참 / 거짓을 반환합니다.

그러나 왜 어떤 방법에는 다른 방법이없는 느낌표 ( !)가 있습니까?

무슨 뜻이에요?



답변

일반적으로 끝나는 !메소드는 메소드가 호출 된 객체수정할 것임을 나타냅니다 . 루비는 다른 사람들이 참조 할 수있는 상태를 변경하기 때문에이를 ” 위험한 메소드 ” 라고 부릅니다 . 다음은 문자열에 대한 간단한 예입니다.

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

출력됩니다 :

a string

표준 라이브러리에는 비슷한 이름의 메서드 쌍이 !있고없는 방법이 많이 있습니다. 없는 것들은 “안전한 방법 (safe methods)”으로 불리며 , 수신자 에 대한 변경 사항이 없이 사본에 적용된 변경 사항이있는 원본의 사본을 반환합니다 . 다음은없는 동일한 예입니다 !.

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

출력 :

A STRING
a string

이것은 컨벤션 일 뿐이지 만 많은 루비 클래스가이를 따릅니다. 또한 코드에서 수정 된 내용을 추적하는 데 도움이됩니다.


답변

느낌표는 많은 것을 의미하며 때로는 “이것은 위험합니다. 조심하세요”이외의 많은 것을 말할 수 없습니다.

다른 사람들이 말했듯이 표준 방법에서는 종종 객체를 돌연변이시키는 방법을 나타내는 데 사용되지만 항상 그런 것은 아닙니다. 많은 표준 방법은 자신의 수신기를 변경 느낌표 (필요는 없습니다 pop, shift, clear), 느낌표 몇 가지 방법이 자신의 수신기를 변경하지 마십시오 ( exit!). 예를 들어이 기사 를 참조하십시오 .

다른 라이브러리에서는 다르게 사용할 수 있습니다. Rails에서 느낌표는 종종 자동으로 실패하지 않고 실패시 예외가 발생 함을 의미합니다.

명명 규칙이지만 많은 사람들이 미묘하게 다른 방식으로 사용합니다. 자신의 코드에서 엄지 손가락의 좋은 규칙은 메서드가 “위험한”작업을 수행 할 때마다, 특히 같은 이름을 가진 두 개의 메서드가 존재하고 그 중 하나가 다른 메서드보다 “위험한”경우이를 사용하는 것입니다. “위험한”은 거의 모든 것을 의미 할 수 있습니다.


답변

이 명명 규칙은 Scheme 에서 해제되었습니다 .

1.3.5 명명 규칙

일반적으로 부울 값을 항상 반환하는 프로 시저 이름은 일반적으로“? ”로 끝납니다. 이러한 절차를 술어라고합니다.

일반적으로 값을 이전에 할당 된 위치 (섹션 3.4 참조)에 저장하는 프로 시저 이름은 일반적으로“! ”로 끝납니다. 이러한 절차를 돌연변이 절차라고합니다. 관례 적으로, 돌연변이 절차에 의해 반환 된 값은 명시되지 않았다.


답변

! 일반적으로 메서드가 결과를 반환하는 대신 개체에 작용 함을 의미합니다. 책 프로그래밍 Ruby에서 :

“위험한”또는 수신자를 수정하는 메소드는 뒤에 “!”로 이름이 지정 될 수 있습니다.


답변

Bang을 사용한 메소드를 말하는 것이 가장 정확합니다! 더 위험 하거나 놀라운 버전입니다. Bang을 사용하지 않고 변경하는 많은 메소드가 .destroy있으며 일반적으로 메소드는 코어 라이브러리에 더 안전한 대안이 존재 하는 Bang 만 있습니다.

예를 들어, Array에는 .compactand가 .compact!있으며 두 메소드 모두 배열을 변경하지만 배열에 .compact!nil이 없으면 self 대신 nil을 반환하므로 self를 반환하는 것보다 더 놀랍습니다.

내가 쾅 발견 한 유일한 비 돌연변이 방법은 Kernel.exit!보다 더 놀라운 .exit당신이 잡을 수 없기 때문에 SystemExit프로세스가 종료된다.

Rails와 ActiveRecord는 .create!실패에 대한 오류를 유발하는 것과 같은보다 ‘놀라운’효과를 위해 강타를 사용한다는 점에서 이러한 추세를 계속합니다 .


답변

themomorohoax.com에서 :

뱅은 내 개인적인 취향에 따라 아래 방법으로 사용할 수 있습니다.

1) 활성 레코드 방법은 원하는대로 수행하지 않으면 오류를 발생시킵니다.

2) 활성 레코드 방법으로 레코드를 저장하거나 방법으로 개체를 저장합니다 (예 : 스트립!)

3) 방법은 장소에 대한 게시물과 같은 “추가”작업을 수행하거나 작업을 수행합니다.

요점은 실제로 필요한지 여부를 생각했을 때만 강타를 사용하는 이유는 다른 개발자에게 강타를 사용하는 이유를 확인해야하는 번거 로움을 덜기 위해서입니다.

뱅은 다른 개발자에게 두 가지 신호를 제공합니다.

1) 메소드를 호출 한 후 객체를 저장할 필요가 없습니다.

2) 메소드를 호출하면 db가 변경됩니다.

http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods


답변

간단한 설명 :

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

그러나 downcase!위의 설명에서 메소드 를 호출 한 경우 foo영구적으로 소문자로 변경됩니다. downcase!새 문자열 객체를 반환하지 않지만 문자열을 제자리로 바꾸고 완전히 foo소문자로 바꿉니다. downcase!꼭 필요한 경우가 아니면 사용 하지 않는 것이 좋습니다 .