배열이 비어 있지 않은지 확인하십시오.


191

메소드 를 사용하여 배열이 비어 있지 않은지 확인하는 것이 좋지 any?않습니까?

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false

아니면 사용하는 것이 더 낫 unless a.empty?습니까?

답변:


248

any?not empty?일부 경우 와 동일하지 않습니다 .

>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false

설명서에서 :

블록이 주어지지 않으면, 루비는 {| obj | obj} (즉, 컬렉션 멤버 중 하나 이상이 false 또는 nil이 아닌 경우 true?를 반환 함)


8
반대의 기능이 empty?있습니까?
RocketR

12
@RocketR 당신은 present?방법 을 체크 아웃 할 수 있습니다 .
dantheta

15
@dantastic #present?은 Rails 전용입니다. 순수한 루비에서는 얻을 수 NoMethodError: undefined method 'present?' for Array있습니다.
RocketR

6
레일 전용이 아니라 Active Support 를 레일없이 사용할 수 있습니다 require 'activesupport'.
Sergio A.

83

값을 평가하는 배열 true과 비어있는 경우 의 차이점 .

이 메소드 empty?는 Array 클래스 http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F 에서 가져옵니다.

배열에 무언가가 포함되어 있는지 여부를 확인하는 데 사용됩니다. 여기에는 및 false과 같이 평가되는 항목이 포함됩니다 .nilfalse

>> a = []
=> []
>> a.empty?
=> true
>> a = [nil, false]
=> [nil, false]
>> a.empty?
=> false
>> a = [nil]
=> [nil]
>> a.empty?
=> false

이 방법 any?은 열거 가능 모듈에서 제공됩니다.
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F

배열의 "any"값이로 평가되는지 평가하는 데 사용됩니다 true. 이와 비슷한 방법이 있습니다 none?, all?그리고 one?그들은 모두 단지 평가 될 수있는 방법을 몇 번이나 사실 확인 곳. 배열에서 찾은 값의 수와는 관련이 없습니다.

사례 1

>> a = []
=> []
>> a.any?
=> false
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> true

사례 2

>> a = [nil, true]
=> [nil, true]
>> a.any?
=> true
>> a.one?
=> true
>> a.all?
=> false
>> a.none?
=> false

사례 3

>> a = [true, true]
=> [true, true]
>> a.any?
=> true
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> false

31

느낌표가있는 문장 앞에 접두사를 붙이면 배열이 비어 있지 않은지 알 수 있습니다. 따라서 귀하의 경우-

a = [1,2,3]
!a.empty?
=> true

27
이중 부정? 진심 이세요?
3lvis

29
그는 그렇게 심각하지 않습니다!
Alexander Bird

5
헤헤 이중 부정은 이상적이지 않으며이 특정 사례에서 더 읽기 쉽습니다.
Denny Abraham Cheriyan

12
이중 음수는 원래 배열 "비어 있지 않은지 확인"의 일부였습니다. 이것은 질문에 대한 답변입니다.
mattfitzgerald

30

any?큰 배열을 피하십시오 .

  • any? 이다 O(n)
  • empty? 이다 O(1)

any? 길이를 확인하지는 않지만 실제로 전체 배열에서 정확한 요소를 검색합니다.

static VALUE
rb_ary_any_p(VALUE ary)
{
  long i, len = RARRAY_LEN(ary);
  const VALUE *ptr = RARRAY_CONST_PTR(ary);

  if (!len) return Qfalse;
  if (!rb_block_given_p()) {
    for (i = 0; i < len; ++i) if (RTEST(ptr[i])) return Qtrue;
  }
  else {
    for (i = 0; i < RARRAY_LEN(ary); ++i) {
        if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qtrue;
    }
  }
  return Qfalse;
}

empty? 반면에 배열의 길이 만 확인합니다.

static VALUE
rb_ary_empty_p(VALUE ary)
{
  if (RARRAY_LEN(ary) == 0)
    return Qtrue;
  return Qfalse;
}

차이는 nil예를 들어 방금 만든 배열과 같이 많은 값으로 시작하는 "스파 스"배열이있는 경우 관련이 있습니다 .


이 유스 케이스에서 차이는 많은 nil값으로 시작하는 "스파 스"배열 any?, 첫 번째 요소에서 블록 리턴이없는 "정상"배열 이있는 경우에만 관련이 있으므로 복잡성은 여전히 empty?메소드 와 같이 O (1)입니다
David 코스타

4

사용 unless하고 blank확인하는 것이 비어 있는지 여부를 제안 합니다.

예 :

unless a.blank?
  a = "Is not empty"
end

이것은 'a'가 비어 있는지 알 수 있습니다. 'a'가 비어 있으면 아래 코드가 실행되지 않습니다.


4
#blank?Rails의 일부입니다. 그들이 이미 Rails를 사용하고 있다면 어쨌든 #present?부정입니다 #blank?.
Eva

0

나는 전혀 사용하는 것이 나쁘지 않다고 생각합니다 any?. 나는 그것을 많이 사용합니다. 명확하고 간결합니다.

그러나 모든 nil값을 버리는 것에 대해 우려가 있다면 실제로 배열에가 있는지 묻습니다 size > 0. 이 경우이 죽은 간단한 확장 (최적화되지 않은 원숭이 스타일)은 당신을 가깝게 만듭니다.

Object.class_eval do

  def size?
    respond_to?(:size) && size > 0
  end

end

> "foo".size?
 => true
> "".size?
 => false
> " ".size?
 => true
> [].size?
 => false
> [11,22].size?
 => true
> [nil].size?
 => true

이것은 논리적으로 "이 객체가 크기를 가지고 있습니까?" 간결하며 ActiveSupport가 필요하지 않습니다. 그리고 구축하기 쉽습니다.

고려해야 할 몇 가지 추가 사항 :

  1. 이것은 같지 않습니다 present? ActiveSupport와는 .
  2. 에 대한 사용자 정의 버전을 원할 수 있습니다 String공백을 무시 (예 : 공백 present?).
  3. 당신은 이름을 원할 수도 있습니다 length?String더 설명하기 쉬운 이나 다른 유형 을 .
  4. 논리 0은을 반환하도록 사용자 지정 Integer및 다른 Numeric유형 을 원할 수 있습니다 false.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.