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
잘못된 조건(예:nil
및 false
).
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로 연락해 주십시오.