개수, 크기, 길이...루비의 선택이 너무 많나요?
저는 이것에 대한 결정적인 답을 찾을 수 없는 것 같고 제가 이것을 "n't level"까지 이해했는지 확인하고 싶습니다 :-)
a = {"a" => "Hello", "b" => "World" }a.카운트 넘버 2a.사이즈#2a.길이 #2 a = [10, 20 ]a.카운트 넘버 2a.사이즈#2a.길이 #2
그럼 어떤 걸 쓸까요?a에 두 개 이상의 요소가 있는지 알고 싶다면 문제가 되지 않는 것 같지만 실제 차이를 이해하고 있는지 확인하고 싶습니다.이는 어레이에도 적용됩니다.저도 같은 결과를 얻었습니다.
또한 ActiveRecord에서는 개수/크기/길이가 서로 다른 의미를 가지고 있다는 것을 알고 있습니다.저는 지금 순수한 루비(1.92)에 관심이 많지만 AR이 만드는 차이점에 대해 이야기하고 싶은 사람이 있다면 그것도 감사할 것입니다.
감사합니다!
어레이 및 해시의 경우 에 대한 별칭입니다.그들은 동의어이고 정확히 같은 일을 합니다.
count
보다 범용성이 높습니다. 요소 또는 술어를 사용하고 일치하는 항목만 계산할 수 있습니다.
> [1,2,3].count{|x| x > 2 }
=> 1
카운트할 파라미터를 제공하지 않는 경우 기본적으로 호출 길이와 동일한 효과를 가집니다.하지만 성능 차이가 있을 수 있습니다.
어레이의 소스 코드를 보면 거의 동일한 작업을 수행한다는 것을 알 수 있습니다.다음은 의 구현을 위한 C 코드입니다.array.length
:
static VALUE
rb_ary_length(VALUE ary)
{
long len = RARRAY_LEN(ary);
return LONG2NUM(len);
}
그리고 다음은 구현의 관련 부분입니다.array.count
:
static VALUE
rb_ary_count(int argc, VALUE *argv, VALUE ary)
{
long n = 0;
if (argc == 0) {
VALUE *p, *pend;
if (!rb_block_given_p())
return LONG2NUM(RARRAY_LEN(ary));
// etc..
}
}
의 코드:array.count
몇 가지 추가 검사를 수행하지만 최종적으로는 정확히 동일한 코드를 호출합니다.LONG2NUM(RARRAY_LEN(ary))
.
반면 해시(소스 코드)는 최적화된 자체 버전을 구현하지 않는 것 같습니다.count
그래서로부터의 구현.Enumerable
(소스 코드)를 사용하여 모든 요소를 반복하고 하나씩 카운트합니다.
일반적으로 사용하는 것이 좋습니다.length
(또는 별칭)size
보다count
총 몇 개의 요소가 있는지 알고 싶다면요.
반면에 액티브레코드와 관련해서는 중요한 차이점이 있습니다.이 게시물을 확인하십시오.
데이터베이스 연결을 사용하는 응용프로그램에는 결정적인 차이가 있습니다.
많은 ORM(ActiveRecord, DataMapper 등)을 사용하는 경우 일반적으로 .size는 데이터베이스에서 모든 항목을 요청하는 쿼리를 생성하고('내 테이블에서 * 선택') 결과 항목 수를 제공합니다.count는 상당히 빠른 단일 쿼리('내 테이블에서 count 선택')를 생성합니다.
이러한 ORM은 매우 보편적이기 때문에 저는 최소한의 놀라움의 원칙을 따릅니다.일반적으로 메모리에 이미 있는 것이 있으면 .size를 사용하고, 내 코드가 데이터베이스(또는 API를 통해 외부 서비스)에 대한 요청을 생성할 경우 .count를 사용합니다.
대부분의 경우(예: 배열 또는 문자열)size
의 별칭입니다.length
.
count
일반적으로 Enumerable에서 제공되며 선택적인 술어 블록을 사용할 수 있습니다.따라서enumerable.count {cond}
[messages] is [messagesis [message](enumerable.select {cond}).length
일치하는 술어의 수가 필요하기 때문에 당연히 중간 구조를 우회할 수 있습니다.
참고: 다음과 같은지는 잘 모르겠습니다.count
블록이 지정되지 않았거나 블록이 다음으로 짧은 경우 강제로 열거형을 평가합니다.length
가능하면.
편집(Mark의 답변에 감사드립니다!): count
블록이 없는 경우(최소한 어레이의 경우) 평가가 강제되지 않습니다.저는 공식적인 행동 없이는 다른 구현을 위한 "개방적"이라고 생각합니다. 어쨌든 술어 없이 평가를 강요하는 것이 정말 타당하다면 말입니다.
저는 http://blog.hasmanythrough.com/2008/2/27/count-length-size 에서 좋은 답을 찾았습니다.
ActiveRecord에서는 연결에 레코드가 몇 개 있는지 확인하는 몇 가지 방법이 있으며, 이들이 작동하는 방식에 약간의 차이가 있습니다.
post.comments.count - SQL COUNT 쿼리를 사용하여 요소의 수를 결정합니다.연결된 요소의 하위 집합만 카운트하도록 조건을 지정할 수도 있습니다(예: 조건 => {:author_name => "continue"}).연결에 카운터 캐시를 설정하면 #count는 새 쿼리를 실행하는 대신 캐시된 값을 반환합니다.
post.comments.length - 항상 연결 내용을 메모리에 로드한 다음 로드된 요소 수를 반환합니다.이전에 연결을 로드한 다음 다른 방법(예: post.comments.create(...) 대신 Comment.create(...)를 사용하여 새 주석을 생성한 경우 업데이트가 강제 적용되지 않습니다.
post.comments.size - 이전 두 옵션의 조합으로 작동합니다.컬렉션이 이미 로드된 경우 #length를 호출하는 것과 마찬가지로 길이를 반환합니다.아직 로드되지 않았다면 #count를 호출하는 것과 같습니다.
개인적인 경험도 있습니다.
<%= h(params.size.to_s) %> # works_like_that !
<%= h(params.count.to_s) %> # does_not_work_like_that !
배열에 다음과 같은 요소가 몇 개 있는지 확인할 수 있는 몇 가지 방법이 있습니다..length
,.count
그리고..size
하만는, 사하것더좋다니습이용을 사용하는 이 좋습니다.array.size
array.count
.왜냐면.size
성능이 더 우수합니다.
Mark Byers 답변에 추가합니다.은 서메에소 입니다.array.size
는 Array#length 메서드의 별칭입니다.이 두 가지 방법을 사용하는 데는 기술적인 차이가 없습니다.성능에도 차이가 없을 수 있습니다.하지만, 그array.count
또한 동일한 작업을 수행하지만 몇 가지 추가 기능을 통해 Array#count
일부 조건을 기준으로 요소의 총 개수를 가져오는 데 사용할 수 있습니다.카운트는 세 가지 방법으로 호출할 수 있습니다.
Array #count # 어레이의 요소 수를 반환합니다.
Array #count n # Array에서 값이 n인 요소의 수를 반환합니다.
Array #count{|i|i.even?} 각 요소 어레이에서 호출된 조건을 기준으로 카운트를 반환합니다.
array = [1,2,3,4,5,6,7,4,3,2,4,5,6,7,1,2,4]
array.size # => 17
array.length # => 17
array.count # => 17
여기서는 세 가지 방법이 모두 동일한 작업을 수행합니다.하지만 여기가 바로 그 곳입니다.count
흥미로워집니다.
예를 들어, 값이 2인 어레이 요소가 몇 개 있는지 확인하고 싶습니다.
array.count 2 # => 3
배열에는 값이 2인 총 세 개의 요소가 있습니다.
이제 4보다 큰 모든 어레이 요소를 찾습니다.
array.count{|i| i > 4} # =>6
배열에는 > 4보다 큰 총 6개의 요소가 있습니다.
에 대한 정보가 좀 제공되기를 바랍니다.count
방법.
언급URL : https://stackoverflow.com/questions/4550770/count-size-length-too-many-choices-in-ruby
'programing' 카테고리의 다른 글
Gem 중에 확인되지 않은 사양:Specification.reset: (0) | 2023.06.01 |
---|---|
텍스트 편집 커서 색상 설정 (0) | 2023.06.01 |
ORM은 NoSQL API와 중복됩니까? (0) | 2023.06.01 |
파이프 그렙에서 그렙까지 색상 유지 (0) | 2023.05.27 |
항목 연결에 빌드가 표시되지 않습니다. (0) | 2023.05.27 |