programing

'any'를 사용해도 괜찮습니까?배열이 비어 있지 않은지 확인하시겠습니까?

oldcodes 2023. 5. 9. 22:58
반응형

'any'를 사용해도 괜찮습니까?배열이 비어 있지 않은지 확인하시겠습니까?

다음을 사용하여 배열이 비어 있지 않은지 확인하는 것이 나쁜가요?any?방법?

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false

아니면 사용하는 것이 더 나은가요?unless a.empty??

any?와 같지 않습니까?not empty?경우에 따라서는

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

설명서에서 다음을 참조하십시오.

블록이 지정되지 않은 경우 Ruby는 암시적 블록 {|obj|obj}을(를) 추가합니다. 즉, 컬렉션 멤버 중 하나 이상이 거짓이거나 0이 아닌 경우 true를 반환합니다.

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

방법empty?배열 클래스에서 가져옵니다.
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?Enumerable 모듈에서 가져옵니다.
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F

배열의 "임의의" 값이 다음 값으로 평가되는지 여부를 평가하는 데 사용됩니다.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

피하다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값(예: 방금 만든 배열)입니다.

문 앞에 느낌표를 붙이면 배열이 비어 있지 않은지 여부를 알 수 있습니다.그래서 당신의 경우에는-

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

를 사용하는 것이 좋습니다.unless그리고.blank확인할 항목이 비어 있는지 여부입니다.

예:

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

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

저는 사용하는 것이 나쁘다고 생각하지 않습니다.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

이는 논리적으로 "이 개체에 크기가 있습니까?"라고 묻는 상당히 설명적입니다.또한 이는 간결하며 액티브 지원이 필요하지 않습니다.그리고 쉽게 구축할 수 있습니다.

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

  1. 은 이다음같않다습니지과는다않과 .present?제공됩니다.
  2. 다음에 대한 사용자 지정 버전이 필요할 수 있습니다.String무시하는 (예:present?).
  3. 당신은 그 이름을 원할지도 모릅니다.length?위해서String또는 더 설명적일 수 있는 다른 유형.
  4. 다음에 대한 사용자 지정을 원할 수 있습니다.Integer 타기Numerictypes,즉 0이 형, 논이 0을 .false.

언급URL : https://stackoverflow.com/questions/6245929/is-it-ok-to-use-any-to-check-if-an-array-is-not-empty

반응형