Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

#nil?, #empty?, #blank?, #present?의 차이점

Ruby와 Rails에는 값의 존재 또는 객체의 상태를 확인하는 데 사용할 수 있는 몇 가지 메서드가 있습니다. Ruby는 #nil?을 제공합니다. 및 #empty? , 그리고 Rails의 ActiveSupport는 #blank?를 추가합니다. 및 #present? . 이 모든 것은 고유한 방식으로 작동하며 코드에서 잘못된 방법을 사용하면 예기치 않은 결과가 발생할 수 있으므로 각각이 데이터를 평가하는 방법을 아는 것이 중요합니다.

이 기사에서는 이러한 방법에 대한 지식을 새로 고칩니다. 우리는 각각이 사용될 때 어떤 조건이 통과하거나 실패하는지와 각 방법이 사용될 수 있는 객체의 유형을 (재)배울 것입니다. 마지막에 편리한 치트 시트도 제공합니다!

#없음?

#nil? Object의 Ruby 메서드입니다. 수업. 모든 클래스가 이 클래스에서 상속하므로 #nil? 모든 개체에 사용할 수 있습니다. true를 반환합니다. nil의 경우 (NilClass 클래스의 인스턴스 ) 나머지는 모두 false입니다.

nil.nil?
=> true
 
true.nil?
=> false
 
5.nil?
=> false
 
"".nil?
=> false
 
[].nil?
=> false

#비어있나요?

#empty? 문자열, 배열, 해시 및 집합에 사용할 수 있는 방법입니다. true를 반환합니다. 개체의 인스턴스 길이가 0인 경우.

문자열에 사용하면 true를 반환합니다. 빈 문자열의 경우.

"".empty?
=> true

공백 문자는 문자이므로 #empty?를 사용합니다. 공백만 포함하는 문자열에서 false를 반환합니다. . 이 때문에 텍스트의 유효성을 검사할 때 사용하는 가장 좋은 방법이 아닐 수 있습니다. 예를 들어 이 방법을 사용하여 사용자 입력의 유효성을 검사하는 경우 공백만 포함된 입력을 처리하게 될 수 있습니다.

" ".empty?
=> false
 
"\t\n".empty?
=> false

배열, 해시 및 집합의 경우 true를 반환합니다. 요소가 없는 경우.

[].empty?
=> true
 
{}.empty?
=> true
 
require 'set'
Set.new.empty?
=> true

#empty?일 때 nil에 사용됩니다. 또는 메소드가 없는 다른 클래스, NoMethodError 예외가 발생합니다. 따라서 데이터를 확인하는 데 사용하려면 프로그램이 충돌하지 않도록 더 많은 확인을 수행해야 합니다.

if !my_var.nil? && !my_var.empty?
  # make use of my_var
end

더 나은 사용 방법은 Rails #blank?입니다. 방법, 이제 살펴보겠습니다.

#공백?

#blank? (ActiveSupport에서) Rails 메소드입니다. 모든 개체에서 작동합니다.

문자열의 경우 true를 반환합니다. 빈 문자열과 공백 문자만 포함하는 문자열의 경우.

"".blank?
=> true
 
" ".blank?
=> true
 
"\n\t".blank?
=> true

배열, 해시 및 집합의 경우 #empty?와 같이 작동합니다. , true를 반환한다는 점에서 요소가 없는 경우.

[].blank?
=> true
 
{}.blank?
=> true
 
Set.new.blank?
=> true
 
[nil].blank?
=> false
 
["", ""].blank?
=> false
 
person = {:firstName => "John", :lastName => "Doe"}
person.blank?
=> false

false를 반환합니다. true의 경우 및 true 잘못된 조건(예:nilfalse ).

true.blank?
=> false
 
false.blank?
=> true
 
nil.blank?
=> true

보시다시피 #blank?를 사용하는 것이 좋습니다. #empty?보다는 NoMethodErrors가 발생하지 않으므로 데이터 유효성 검사 시 모든 개체에 사용할 수 있으므로 일부 개체에 사용할 때. 또한 공백만 포함하는 문자열에 대해서는 전달되지 않습니다.

#현재?

#present? 또한 Rails 메서드입니다. 이는 #blank?와 반대입니다. 합니다.

!my_var.blank? == my_var.present?
=> true

다음은 몇 가지 예입니다.

"".present?
=> false
 
" ".present?
=> false
 
[].present?
=> false
 
nil.present?
=> false
 
true.present?
=> true
 
false.present?
=> false
 
{}.present?
=> false
 
person = {:firstName => "John", :lastName => "Doe"}
person.present?
=> true
 
5.present?
=> true

이것은 또한 #empty?보다 검증을 위한 더 나은 방법입니다. #blank?에서 다룬 것과 같은 이유로 .

결론

이러한 방법의 이름은 혼동하기 쉬우므로 북마크에 추가할 수 있는 편리한 치트 시트가 있습니다.

#nil? #empty? #blank? #present?
5 false NoMethodError false true
"" false true true false
" " false false true false
"\t\n" false false true false
[] false true true false
["a"] false false false true
{} false true true false
{a: "b"} false false false true
Set.new false true true false
nil true NoMethodError true false
true false NoMethodError false true
false false NoMethodError true false

모든 것과 마찬가지로 #nil? 중에서 선택합니다. , #empty? , #blank?#present? 상황에 따라 다릅니다. 사용자에게 주소를 지정할 이름이 있는지 확인하려면 #present? 예를 들어 잘 맞을 수 있습니다. 그러나 #blank?#present 값이 잘못된 유형일 때 오류를 발생시키지 않음으로써 코드의 버그를 숨길 수 있는 모든 개체에 대해 부울을 반환합니다.

Ruby에서 값 확인에 대한 기억을 새로 고쳤기를 바랍니다. 질문이나 의견이 있으시면 주저하지 말고 @AppSignal로 연락해 주십시오.