Ruby에서 nil vs. empty vs. blank를 이해하는 방법


1129

나 자신은 반복의 차이의 명확한 정의를 찾고 발견 nil?, blank?그리고 empty?루비 온 레일즈. 내가 가장 가까이 온 것은 다음과 같습니다.

  • blank?객체가 거짓, 비어 있거나 공백 문자열입니다. 예를 들어, "", " ", nil, [], 그리고 {}비어 있습니다.

  • nil? 객체는 NilClass의 인스턴스입니다.

  • empty?객체는 클래스마다 다르며 정의는 클래스마다 다릅니다. 문자열에 문자가 없으면 비어 있고 배열에 항목이 없으면 비어 있습니다.

빠뜨릴 수있는 것이 있습니까?


26
하나는 빈 배열이며에 대해 false를 반환합니다 present?. blank?빈 배열에 대해 true를 반환 하기 때문 입니다.
Kris

4
하나의 좋은 점은보고입니다 :nil?에 정의 ::Kernel및 재정의 ::NilClass하면서, :empty?많은 클래스에 별도로 구현 (기본적에 ::String, ::Array, ::Hash, 비 - 기본적으로 같은 다른 클래스에 ::Set다음 stdlib에서와 ::ActiveRecord::Relation레일에서). 따라서 :nil?클래스에 구체적으로 구현되거나 포함되어야 하는 자체 하위 클래스의 모든 하위 클래스 ::Object와 모든 클래스에서 사용할 수 있습니다. ::Kernel:empty?
다시 작성

전체 nil개념 을 이해하려면 여기에서 시작하십시오 .
totymedli 2016 년

[1] pry(main)> [].blank? => true
Michael

답변:


1437

.nil? 모든 객체에 사용할 수 있으며 객체가 nil이면 true입니다.

.empty? 문자열, 배열 및 해시에 사용할 수 있으며 다음과 같은 경우 true를 반환합니다.

  • 문자열 길이 == 0
  • 배열 길이 == 0
  • 해시 길이 == 0

.empty?nil 인 것을 실행 하면을 던질 것이다 NoMethodError.

곳이다 .blank?온다. 그것이 레일에 의해 구현 과 같은 모든 개체뿐만 아니라 작업에 작동 .empty?문자열, 배열 및 해시합니다.

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank? 비어 있지 않지만 공백 만 포함하는 문자열에서도 true를 평가합니다.

"  ".blank? == true
"  ".empty? == false

Rails는 또한 .present? 부정을 반환하는을 제공합니다.blank? .

배열 잡았다 : blank?리턴 false모든 경우에도 요소 배열이 비어 있습니다. 이 경우 공백, 사용 결정하기 all?blank?예를 들어, :

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 

27
질문에서 언급했듯이 비어 있지 않은 일부 문자열은 공백으로 계산됩니다.
Andrew Grimm

1
왜 그들은 nil의 .empty를 덮어 쓰지 않았습니까? .blank를 추가 할 수 있다면?
tillda

6
false.blank? == true
Shannon Shannon

2
나는 언급 할 것이다 presence!
Marc-André Lafortune

2
Tom이 자신의 답변에서 언급 한 모든 공백 배열 문제 외에도 공격자가 params.nil이 아닌 경우 단순히 검사하는 준비되지 않은 코드를 사용할 수있는 보안 문제가 발생할 수 있습니다. 또는 params.blank?가 아니면 Rails에서 현재 많은 토론과 작업의 원인입니다. 자세한 내용은 여기를 참조하십시오 : github.com/rails/rails/issues/13420
Houen

675

모든 경우에 유용한 테이블을 만들었습니다.

여기에 이미지 설명을 입력하십시오

blank?, present?레일에 의해 제공된다.


57
그 빈칸에 주목해야합니까? 그리고 선물? Rails 전용입니다. Ruby 2.0.0에서는 예외 : NoMethodError를 반환합니다.
Lonny Eachus

17
any?테이블을 업데이트 한 경우 추가를 고려하십시오 .
Dennis

blank?그리고 present?하지 "하는 레일 전용 ", 그들은 자동으로 레일으로 포함하고 있지만, 쉽게 ActiveSupport의 코어 확장을 사용하여 비 레일 코드에 포함 할 수 있습니다. 참조 stackoverflow.com/questions/4238867/...을
양철 맨

215

Julian의 테이블을 확장하십시오.

여기에 이미지 설명을 입력하십시오

참고 : 비어 있습니까? 공백? 아니요? 傻傻 分不清楚


1
@Sibevin Wang, 나는이 표를 다운로드하여 크레딧을 추가하는 내 대답 중 일부에서 사용했습니다. 당신이 신경 쓰지 않기를 바랍니다 :)이 위대한 노력에 찬사!
Lahiru

1
Enumerable#any?바닐라 루비가 아래에 나열되어서는 안된다 "전용 레일"
daniero

1
@daniero 알림 주셔서 감사합니다, 표가 업데이트되었습니다.
Sibevin Wang

숫자 유형도 .zero?있고.nonzero?
DaveMongoose

63

빠른 팁 : !obj.blank? == obj.present?

일부 표현에서 눈에 편하고 더 쉬울 수 있습니다


! obj.nil과 동등한 것이 있습니까?
Kirk

present?active_support의 일부이므로 여기에 포함 할 내용을 확인하십시오. stackoverflow.com/a/4648704/1569
Factor Mystic

2
@ Kirk : !! obj는! obj.nil과 동일합니까?
Mohamed Hafez

4
아니에요. !!false
Ajedi32

아, @ Ajedi32 잘 잡아! 한 가지 예외와 같습니다.
Mohamed Hafez

52

한 가지 차이점이 있다는 것입니다 .nil?.empty?반면, 프로그래밍 언어 루비가 제공하는 방법이 .blank?뭔가 추가 웹 개발 프레임 워크 레일에 의해이.


49

여기에 이미지 설명을 입력하십시오

  • 이다 모든 nil?입니다blank?
  • 이다 모든 empty?입니다blank?
  • 이다 아무것도 empty?없다nil?
  • 이다 아무것도 nil?없다empty?

TL; DR -에만 사용 blank?present?당신을 구별하지 않으려면 """ "


2
와! 내 +1을 받았습니다
오전

16

부울 값이 0인지 평가하려고 할 때 특별한 경우입니다.

false.present? == false
false.blank? == true
false.nil? == false

이 경우 권장 사항은 .nil?


14

any?권장 사항에 대한 약간의 참고 사항 : 일반적으로 와 동등한 것이 맞습니다 !empty?. 그러나 공백 (ala ) 문자열로 any?돌아갑니다 .true" "

물론 위의 1.9 주석도 참조하십시오.


Rails에서 공백 문자 만 포함하는 문자열은 "blank": "\ n \ r \ t".blank? # => true
Lonny Eachus

13

any?일반적으로 어느 것을 잊지 마십시오 !empty?. Rails에서는 일반적으로 명세서 끝에 무언가가 있는지 확인 if something하거나 필요한 곳 ​​어디에서나 unless something사용할 blank?수 있으므로 필요한 곳에서 사용 합니다.


4
.어떤? 루비 1.9의 문자열에서는 .any로 작동하지 않습니까? 열거 가능하고 string # each 자체는 루비 1.9에서 작동하지 않습니다.
앤드류 그림

4
비어 any?있지 않은지 확인하기 위해 주의하십시오 . 잘못된 값의 배열이 있으면 false를 반환합니다. 이 문제를 해결하는 방법은 always-true 블록을 전달하는 것입니다. [nil, false].any?{ true }하지만 !empty?더 짧으며 이상한 동작을 기억하지 못합니다.
Kelvin

12

nil?모든 객체에서 호출 할 수있는 표준 Ruby 메소드이며 true객체가 nil다음 과 같은 경우에 반환 됩니다 .

b = nil
b.nil? # => true

empty?Strings, Arrays 및 Hashes와 같은 일부 객체에서 호출 할 수있는 표준 Ruby 메소드이며 true이러한 객체에 요소가 없으면 반환 합니다.

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty?nil객체에 대해 호출 할 수 없습니다 .

blank?nil빈 객체뿐만 아니라 객체 에서도 호출 할 수있는 Rails 메서드입니다 .


7

다른 사람들은 차이점이 무엇인지 잘 설명했습니다.

내가 루비 레일에 추가하고 싶은, 그것을 사용하는 것이 좋습니다 obj.blank?또는 obj.present?대신 obj.nil?obj.empty?.

obj.blank?모든 종류의 처리 nil, '', [], {}, 반환 true값을 사용할 수없는 경우 반환 false값은 객체의 유형에 사용할 수있는 경우.


5

exists?이 방법을 사용하면 데이터베이스에 데이터가 있는지 여부를 확인할 수 있습니다. 그것은 부울 값 중 하나를 반환 true또는 false.


모델 클래스에서만 작동합니다!
Roger

4

레일 4

@ corban-brook의 'Array gotcha : blank?'에 대한 대안 배열이 빈 값만 보유하고 공백으로 간주 될 수 있는지 확인하기 위해? 진실:

[ nil, '' ].all? &:blank? == true

하나는 또한 할 수 있습니다 :

[nil, '', "", " ",' '].reject(&:blank?).blank? == true

3

nil?모든 객체에 사용할 수 있습니다. '공백'값을 포함하여 오브젝트에 값이 있는지 여부를 판별합니다.

예를 들면 다음과 같습니다.

example = nil
example.nil?  # true

"".nil?  # false

기본적으로 nil?객체가 실제로 'nil'인 경우에만 true를 반환합니다.

empty?컬렉션으로 간주되는 객체에서만 호출됩니다. 여기에는 문자열 (문자 모음), 해시 (키 / 값 쌍 모음) 및 배열 (임의 객체 모음)이 포함됩니다. empty?컬렉션에 항목이 없으면 true를 반환합니다.

예를 들면 다음과 같습니다.

"".empty? # true
"hi".empty?   # false
{}.empty?  # true
{"" => ""}.empty?   # false
[].empty?   # true
[nil].empty?  # false

nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass

공지 사항 empty?전무 개체를 수집하지 않습니다 그것은 예외를 발생하므로 전무 객체에 호출 할 수 없습니다.

컬렉션의 항목이 비어 있어도 컬렉션이 비어있는 것은 아닙니다.

blank?기본적으로의 조합 nil?그리고 empty?그것은 당신이 모음 가정 것을 물체를 확인하는 데 유용하지만 또한 전무 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.