문제

루비에서는 일부 방법에 물음표가 있습니다 (?) 그런 질문을합니다 include? 해당 물체가 포함되어 있는지 묻는 다음 True/False를 반환합니다.

그러나 왜 일부 방법은 느낌표가 있습니다 (!) 다른 사람이없는 곳?

무슨 뜻인가요?

도움이 되었습니까?

해결책

일반적으로 끝나는 방법 ! 이 방법이 의지를 나타냅니다 호출 된 객체를 수정하십시오. 루비는 이것을 "로"라고 부릅니다.위험한 방법"그들은 다른 사람이 참조 할 수 있다고 말하기 때문에 변화하기 때문에 다음은 문자열에 대한 간단한 예입니다.

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

이것은 출력됩니다 :

a string

표준 라이브러리에는 유사하게 명명 된 메소드 쌍을 볼 수있는 곳이 많이 있습니다. ! 그리고 하나가없는 것. 없는 것은 "안전한 방법"이라고 불리며, 변경 사항이있는 원본의 사본을 반환합니다. 사본, Callee가 변경되지 않았습니다. 다음은 다음과 같은 예입니다 !:

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에서 느낌표는 종종 방법이 조용히 실패하기보다는 실패에 대한 예외를 던지는 것을 의미합니다.

그것은 명명 컨벤션이지만 많은 사람들이 미묘하게 다른 방식으로 그것을 사용합니다. 자신의 코드에서는 방법이 "위험한"일을 할 때마다, 특히 동일한 이름을 가진 두 가지 방법이 존재하고 그 중 하나가 다른 방법보다 "위험한"경우를 사용하는 것입니다. "위험한"은 거의 모든 것을 의미 할 수 있습니다.

이 이름 지정 협약은 해제되었습니다 계획.

1.3.5 명명 규칙

컨벤션에 의해, 부울 가치를 항상 반환하는 절차의 이름은 일반적으로``? ''로 끝납니다. 이러한 절차를 Predicates라고합니다.

컨벤션별로, 값을 이전에 할당 된 위치에 저장하는 절차의 이름은 일반적으로``! ''로 끝납니다. 이러한 절차를 돌연변이 절차라고합니다. 협약에 의해, 돌연변이 절차에 의해 반환 된 값은 지정되지 않았다.

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

"위험한"또는 수신기를 수정하는 방법은 후행으로 명명 될 수 있습니다! "

themomorohoax.com :

Bang은 개인적인 취향 순서대로 아래 방식으로 사용할 수 있습니다.

1) 활성 레코드 방법은 메소드가 말하는 것을 수행하지 않으면 오류가 발생합니다.

2) 활성 레코드 방법은 레코드를 저장하거나 메소드가 객체를 저장합니다 (예 : 스트립!).

3) 방법은 어떤 곳에 게시물을 게시하거나 어떤 조치를 취하는 경우에도 "추가"를 수행합니다.

요점은 다음과 같습니다. 필요한지에 대해 생각했을 때만 강타를 사용하고 다른 개발자가 왜 Bang을 사용하는지 확인해야한다는 성가심을 구해주십시오.

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

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

2) 방법을 호출하면 DB가 변경됩니다.

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

뱅으로 그 방법을 말하는 것이 가장 정확합니다! 더 많다 위험한 또는 놀라운 버전. 다음과 같은 뱅없이 돌연변이하는 방법이 많이 있습니다. .destroy 그리고 일반적으로 방법은 핵심 lib에 더 안전한 대안이 존재하는 앞머리 만 있습니다.

예를 들어, 배열에서 우리는 가지고 있습니다 .compact 그리고 .compact!, 두 방법 모두 배열을 돌연변이하지만 .compact! 배열에 nil이 없다면 자기 대신에 nil을 반환합니다.

내가 Bang에서 찾은 유일한 비전화 방법은 Kernel'에스 .exit! 어느 것보다 더 놀랍습니다 .exit 당신은 잡을 수 없기 때문에 SystemExit 프로세스가 닫히는 동안.

Rails와 Activerecord는 더 많은 '놀라운'효과를 위해 Bang을 사용한다는 점에서 이러한 추세를 계속합니다. .create! 실패시 오류가 발생합니다.

간단한 설명 :

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! 완전히 필요하지 않는 한.

!

나는 이것을 그 전에 사라진 모든 것을 파괴하는 폭발적인 변화로 생각하고 싶습니다. BANG 또는 FERCTAMATION 마크는 코드에서 영구적 인 저장된 변경을하고 있음을 의미합니다.

예를 들어 Ruby의 글로벌 대체 방법을 사용하는 경우gsub!당신이 만드는 대체는 영구적입니다.

상상할 수있는 또 다른 방법은 텍스트 파일을 열고 찾아서 교체 한 다음 저장하는 것입니다. ! 코드에서 동일합니다.

Bash World에서 온 경우 또 다른 유용한 알림은 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

원래 값에 다시 액세스하고 싶을 경우를 대비하여.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top