답변:
any?
not empty?
일부 경우 와 동일하지 않습니다 .
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
설명서에서 :
블록이 주어지지 않으면, 루비는 {| obj | obj} (즉, 컬렉션 멤버 중 하나 이상이 false 또는 nil이 아닌 경우 true?를 반환 함)
present?
방법 을 체크 아웃 할 수 있습니다 .
#present?
은 Rails 전용입니다. 순수한 루비에서는 얻을 수 NoMethodError: undefined method 'present?' for Array
있습니다.
require 'activesupport'
.
true
과 비어있는 경우 의 차이점 .이 메소드 empty?
는 Array 클래스 http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F 에서 가져옵니다.
배열에 무언가가 포함되어 있는지 여부를 확인하는 데 사용됩니다. 여기에는 및 false
과 같이 평가되는 항목이 포함됩니다 .nil
false
>> 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
느낌표가있는 문장 앞에 접두사를 붙이면 배열이 비어 있지 않은지 알 수 있습니다. 따라서 귀하의 경우-
a = [1,2,3]
!a.empty?
=> true
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)입니다
나는 전혀 사용하는 것이 나쁘지 않다고 생각합니다 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가 필요하지 않습니다. 그리고 구축하기 쉽습니다.
고려해야 할 몇 가지 추가 사항 :
present?
ActiveSupport와는 .String
공백을 무시 (예 : 공백 present?
).length?
을 String
더 설명하기 쉬운 이나 다른 유형 을 .Integer
및 다른 Numeric
유형 을 원할 수 있습니다 false
.
empty?
있습니까?