루비에서 지도와 수집의 차이점은 무엇입니까?
나는 이것을 구글에 검색하고 단편적이고 모순된 의견을 얻었습니다 - 실제로 하는 것과 다른 점이 있습니까?map
그리고 하는 것.collect
루비/레일즈의 배열에?
문서에는 아무런 제안이 없는 것 같습니다만, 혹시 방법이나 성능에 차이가 있을까요?
사실 차이는 없습니다.map
C에서 구현됨rb_ary_collect
그리고.enum_collect
(예: 사이에 차이가 있음)map
배열 및 다른 열거형에 있지만, 사이에 차이는 없습니다.map
그리고.collect
).
와 둘 다 루비에 존재하는 이유는 무엇입니까?그map
함수에는 여러 언어로 된 명명 규칙이 있습니다.위키백과는 개요를 제공합니다.
맵 함수는 함수형 프로그래밍 언어에서 시작되었지만 오늘날 많은 절차적, 객체 지향 및 다중 패러다임 언어에서도 지원됩니다.C++의 표준 템플릿 라이브러리에서는 다음과 같이 부릅니다.
transform
C#(3.0)의 LINQ 라이브러리에서는 다음과 같은 확장 방법으로 제공됩니다.Select
맵은 또한 펄, 파이썬, 루비와 같은 고급 언어에서 자주 사용되는 작업입니다.map
이 세 가지 언어로.지도에 대한 별칭도 Ruby(Smalltalk에서 제공) [mine 강조]에 제공됩니다.Common Lisp는 맵과 유사한 함수들의 집합을 제공합니다; 여기에 설명된 동작에 해당하는 것은 다음과 같습니다.mapcar
(-CAR 작동을 사용하여 접근할 수 있음을 나타내는 차량)
Ruby는 Smalltalk 세계의 프로그래머들이 더 편안하게 느낄 수 있도록 별칭을 제공합니다.
어레이 및 열거형에 대해 다른 구현이 있는 이유는 무엇입니까?열거형은 일반화된 반복 구조이며, 이는 루비가 다음 요소를 예측할 수 있는 방법이 없음을 의미합니다(무한 열거형을 정의할 수 있습니다. 예를 들어 프라임을 참조하십시오).따라서 각 연속 요소를 얻기 위해 함수를 호출해야 합니다(일반적으로 이것은each
방법)을 선택합니다.
어레이는 가장 일반적인 컬렉션이므로 성능을 최적화하는 것이 합리적입니다.Ruby는 어레이 작동 방식에 대해 많이 알고 있으므로 호출할 필요가 없습니다.each
상당히 빠른 단순 포인터 조작만 사용할 수 있습니다.
다음과 같은 여러 어레이 방법에 대해 유사한 최적화가 있습니다.zip
또는count
.
나는 들었습니다. 그들은 같습니다.
실제로는 ruby-doc.org 의 동일한 위치에 문서화되어 있습니다.
http://www.ruby-doc.org/core/classes/Array.html#M000249
- ary.collect {|item| block } → new_ary
- ary.map {|item| 블록 } → new_ary
- ary.collect → an_계산기
- ary.map → an_computor
각 자기 요소에 대해 블록을 한 번 호출합니다.블록에서 반환된 값을 포함하는 새 배열을 만듭니다.Enumerable #collect가 있습니다.
블록이 지정되지 않은 경우 열거자가 대신 반환됩니다.a = [ "a", "b", "c", "d" ] a.collect {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"] a #=> ["a", "b", "c", "d"]
그collect
그리고.collect!
는 는드에대별다니칭입한메서의 입니다.map
그리고.map!
서로 바꾸어 사용할 수 있습니다.다음은 확인하기 쉬운 방법입니다.
Array.instance_method(:map) == Array.instance_method(:collect)
=> true
저는 이 질문에 답하기 위해 벤치마크 테스트를 실시했고, 이 게시물을 발견했습니다. 따라서 여기 제가 발견한 결과가 있습니다(다른 답변과 약간 다름).
벤치마크 코드는 다음과 같습니다.
require 'benchmark'
h = { abc: 'hello', 'another_key' => 123, 4567 => 'third' }
a = 1..10
many = 500_000
Benchmark.bm do |b|
GC.start
b.report("hash keys collect") do
many.times do
h.keys.collect(&:to_s)
end
end
GC.start
b.report("hash keys map") do
many.times do
h.keys.map(&:to_s)
end
end
GC.start
b.report("array collect") do
many.times do
a.collect(&:to_s)
end
end
GC.start
b.report("array map") do
many.times do
a.map(&:to_s)
end
end
end
그리고 제가 얻은 결과는 다음과 같습니다.
user system total real
hash keys collect 0.540000 0.000000 0.540000 ( 0.570994)
hash keys map 0.500000 0.010000 0.510000 ( 0.517126)
array collect 1.670000 0.020000 1.690000 ( 1.731233)
array map 1.680000 0.020000 1.700000 ( 1.744398)
가명은 무료가 아닌가요?
Ruby는 Array#map 메서드를 Array#collect에 별칭을 붙입니다. 이들은 서로 바꾸어 사용할 수 있습니다. (Ruby Monk)
즉, 동일한 소스 코드:
static VALUE
rb_ary_collect(VALUE ary)
{
long i;
VALUE collect;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
collect = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
rb_ary_push(collect, rb_yield(RARRAY_AREF(ary, i)));
}
return collect;
}
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
#collect
에대 별다니입칭의 입니다.#map
즉, 두 가지 방법을 서로 바꾸어 사용할 수 있고 동일한 동작을 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5254732/difference-between-map-and-collect-in-ruby
'programing' 카테고리의 다른 글
SQL에서 인덱스란 무엇입니까? (0) | 2023.06.02 |
---|---|
용량이 아닌 특정 크기로 목록을 초기화하는 방법 (0) | 2023.06.02 |
Angular HttpClient에 HTTP 헤더를 추가해도 헤더가 전송되지 않습니다. 왜죠? (0) | 2023.06.02 |
텍스트 편집 필드의 값 가져오기 (0) | 2023.06.02 |
비트맵 개체에 이미지를 로드하는 동안 이상한 메모리 부족 문제가 발생했습니다. (0) | 2023.06.02 |