루비 방법에 느낌표가 사용되는 이유는 무엇입니까?
-
03-07-2019 - |
문제
루비에서는 일부 방법에 물음표가 있습니다 (?
) 그런 질문을합니다 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
원래 값에 다시 액세스하고 싶을 경우를 대비하여.