Programing

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

lottogame 2020. 2. 12. 07:57
반응형

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


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

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

무슨 뜻인가요?


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

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

출력됩니다 :

a string

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

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!꼭 필요한 경우가 아니면 사용 하지 않는 것이 좋습니다 .


!

나는 이것을 이전의 모든 것을 파괴하는 폭발적인 변화로 생각하고 싶다. 쾅 또는 느낌표는 코드를 영구적으로 저장하고 있음을 의미합니다.

예를 들어 루비의 전역 대체 방법을 사용 gsub!하면 대체는 영구적입니다.

상상할 수있는 또 다른 방법은 텍스트 파일을 열고 찾기 및 바꾸기를 수행 한 다음 저장하는 것입니다. !코드에서도 마찬가지입니다.

bash 세계에서 온 또 다른 유용한 알림은 sed -i영구적으로 저장된 변경을 수행하는 것과 비슷한 효과가 있습니다.


"파괴적 방법"이라고 부르는 이들은 당신이 언급 한 대상의 원본을 바꾸는 경향이 있습니다.

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

결론 : !메소드는 호출 된 객체의 값을 변경하는 반면 메소드가없는 !메소드는 메소드가 호출 된 객체를 덮어 쓰지 않고 조작 된 값을 반환합니다.

!메소드를 호출 한 변수에 저장된 원래 값이 필요하지 않은 경우 에만 사용 하십시오.

나는 다음과 같은 것을 선호합니다 :

foo = "word"
bar = foo.capitalize
puts bar

또는

foo = "word"
puts foo.capitalize

대신에

foo = "word"
foo.capitalize!
puts foo

원래 값에 다시 액세스하려는 경우를 대비하여.

참고 URL : https://stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods



반응형