느낌표가 루비 방식에 사용되는 이유는 무엇입니까?
Ruby 서일물음표는에드에부소메(표물▁in음ru▁(▁a▁have▁mark)를 가집니다.?와 같은 것입니다.include?문제의 개체가 포함되어 있는지 묻는 메시지를 표시한 다음 참/거짓을 반환합니다.
왜 붙일까요?!다른 사람들은 그렇지 않은 곳?
그것은 무엇을 뜻하나요?
일적으로, 다과같끝방법으로 방법.!메서드가 호출된 개체를 수정함을 나타냅니다.Ruby는 다른 사람이 참조할 수 있는 상태를 변경하기 때문에 이러한 방법을 "위험한 방법"이라고 부릅니다.다음은 문자열에 대한 간단한 예입니다.
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!예를 들어 이 기사를 참조하십시오.
다른 라이브러리에서는 다르게 사용할 수 있습니다.레일에서 느낌표는 종종 메소드가 자동으로 실패하는 대신 실패할 때 예외를 던짐을 의미합니다.
이것은 명명 규칙이지만 많은 사람들이 미묘하게 다른 방식으로 사용합니다.당신 자신의 코드에서 엄지손가락의 좋은 규칙은 어떤 방법이 "위험한" 일을 할 때마다 그것을 사용하는 것입니다. 특히 같은 이름을 가진 두 가지 방법이 존재하고 그 중 하나가 다른 방법보다 더 "위험한" 경우에 그렇습니다.하지만 "위험한"은 거의 모든 것을 의미할 수 있습니다.
이 명명 규칙이 구성표에서 해제되었습니다.
1.3.5 명명 규칙
관례상 항상 부울 값을 반환하는 프로시저의 이름은 보통 "?"로 끝납니다. 이러한 프로시저를 술어라고 합니다.
관례에 따라 이전에 할당된 위치에 값을 저장하는 절차의 이름(섹션 3.4 참조)은 보통 "!"로 끝납니다.이러한 과정을 돌연변이 과정이라고 합니다.관례에 따라 변환 절차에서 반환되는 값은 지정되지 않습니다.
일반적으로 메서드는 결과를 반환하는 대신 개체에 대해 작업을 수행합니다.Programming Ruby 책에서:
수신기를 수정하거나 "위험"한 메서드는 후행 "!"로 이름을 지정할 수 있습니다.
Bang!을 사용하는 방법이 더 위험하거나 놀라운 버전이라고 말하는 것이 가장 정확합니다.일반적인 방법은 코어 lib에 더 안전한 대안이 존재하는 경우에만 앞머리를 갖는 등 뱅 없이 돌연변이를 일으키는 방법이 많습니다.
에는 예들어, 어에는이가 ..compact그리고..compact! 모두시키지만, 두 방 법 모 배 변 키 지 시 형 만 을 열 두 지 키 만 ▁both , 시 , ▁mut 변.compact!배열에 0이 없으면 self 대신 none을 반환합니다. 이는 self를 반환하는 것보다 더 놀라운 일입니다.
내가 발견한 유일한 비 돌연변이 방법은Kernel보다 더 놀라운 것은.exit은 수을없때문에기를 잡을 수 없기 SystemExit프로세스가 종료되는 동안
Rails and ActiveRecord는 실패 시 오류가 발생하는 것과 같은 더 많은 '놀라운' 효과를 위해 bang을 사용한다는 점에서 이러한 추세를 지속합니다.
themomorohoax.com 에서:
뱅은 제 개인적인 취향에 따라 아래와 같은 방법으로 사용할 수 있습니다.
활성 레코드 메서드는 메서드가 지정한 대로 수행하지 않으면 오류가 발생합니다.
활성 레코드 메서드는 레코드를 저장하거나 메서드는 개체를 저장합니다(예: 스트립!).
메소드는 어딘가에 게시하는 것과 같은 "추가"를 수행하거나 일부 작업을 수행합니다.
요점은, 당신이 왜 당신이 뱅을 사용하는지 확인해야 하는 짜증을 다른 개발자들을 구하기 위해, 그것이 필요한지에 대해 정말로 생각했을 때에만 뱅을 사용한다는 것입니다.
뱅은 다른 개발자들에게 두 가지 신호를 제공합니다.
메서드를 호출한 후 개체를 저장할 필요가 없습니다.
메소드를 호출하면 DB가 변경됩니다.
간단한 설명:
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영구 저장된 변경을 수행하는 것과 유사한 효과가 있습니다.
결론:!가 없는 는 호출된 객체의 값을 변경합니다.!메서드가 호출된 개체를 덮어쓰지 않고 조작된 값을 반환합니다.
만 합니다.!메서드를 호출한 변수에 저장된 원래 값이 필요하지 않은 경우.
저는 다음과 같은 일을 하는 것을 선호합니다.
foo = "word"
bar = foo.capitalize
puts bar
OR
foo = "word"
puts foo.capitalize
대신에
foo = "word"
foo.capitalize!
puts foo
혹시 제가 원래 값에 다시 접속하고 싶을 때를 대비해서요.
"파괴적 방법"이라고 불립니다.참조하는 개체의 원본을 변경하는 경향이 있습니다.
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]
은 내대답은설다명니합을성요중의의 합니다.Ruby다음과 같은 맥락에서 느낌표가 있는 방법Ruby on Rails(RoR) 모델 검증.
기본적으로 개발자는 모델 유효성 검사(여기서 설명)를 정의할 때마다 데이터베이스 레코드 변경을 거부하고 문제의 레코드를 업데이트하기 위해 잘못된 데이터가 제출된 경우 관련 예외를 발생/해제하는 것이 궁극적인 목표입니다.
RoRActiveRecordgem은 다양한 모델 조작 방법을 정의합니다(Ruby on Rails 가이드).그 방법들 중에서,valid?메서드는 데이터베이스 작업/수정 없이 유효성 검사를 트리거하는 유일한 메서드입니다.나머지 메소드는 데이터베이스 변경을 시도합니다.
이러한 메서드는 실행될 때마다 콜백을 트리거합니다.목록의 일부 메소드는 셰방이 있는 자매 메소드를 특징으로 합니다.둘 사이의 차이점은 무엇입니까?레코드 유효성 검사에 실패할 때마다 반환되는 콜백 형식과 관련이 있습니다.
느낌표/쉐방이 없는 메소드는 레코드 유효성 검사에 실패할 경우 부울 false만 반환하는 반면 셰방이 있는 메소드는 예외를 발생시키고 코드에서 적절하게 처리할 수 있습니다.
제가 직접 경험한 이후로, 미리 알려드립니다.
루에서.!개체를 변환하고 반환합니다. 그지않반환니다됩면으렇다니▁return▁will▁otherwise를 반환합니다.nil.
예를 들어 배열에 대해 어떤 작업을 수행하는 경우 메소드를 호출합니다..compact!할 때 compact가 그고압높없습니다가이할축리▁return다없▁and니를 반환합니다. 다시 돌아올 것입니다.nil.
예:
arr = [1, 2, 3, nil]
arr.compact!
=> [1, 2, 3]
Run again arr.compact!
=> nil
배열을 다시 명시적으로 반환하는 것이 좋습니다.arr만약 당신이 그것을 사용해야 한다면, 그렇지 않으면 당신은 그것을 얻을 것입니다.nilvalue.value.value.
예:
arr = [1, 2, 3]
arr.compact! => nil
arr # to get the value of the array
언급URL : https://stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods
'programing' 카테고리의 다른 글
| 열의 값을 기존 데이터 프레임의 행 이름으로 변환 (0) | 2023.06.26 |
|---|---|
| 주변 선언이란 무엇입니까? (0) | 2023.06.26 |
| '지정한 문자열이 제목에 필요한 형식이 아닙니다.'를 확인하는 중입니다. (0) | 2023.06.26 |
| 비동기/대기를 사용하여 방화벽에서 쿼리 실행 (0) | 2023.06.26 |
| "워크시트 함수 클래스의 Vlookup 속성을 가져올 수 없음" 오류 (0) | 2023.06.21 |