find로 시작하는 열거 자 체인

로마 인

열거 자 체인의 경우 머리를 돌릴 수 없습니다.

[1, 2, 3, 4, 5].find.map { |x| x * x }
#=> [1, 4, 9, 16, 25]

이것은 초기 값 제곱의 배열을 반환하지만, [1]

나는 모든 것을 해체하려고 노력했고 이것이 내가 얻은 것입니다. 원래 배열 .mapfind열거 자에서 호출됩니다 . each반복에 대한 값을 얻기 위해 자체적으로 호출 합니다. eachon enumerator는 열거자가 생성 된 메서드, 즉 find. find배열의 첫 번째 요소를 가져 와서 양보하고 예제의 블록에 도달 할 때까지 계속 양보됩니다. 값은 제곱됩니다 블록 반환은, 기본 each의 블록 map정의를 반환 [1], 그것은 아래로 떨어 find, 그것은 이후 true부울 의미에서, 나는 기대 find효과적으로 반복을 종료,이 시점에서 복귀하지만, 어떻게 든 먹이 값을 유지 배열에서 map블록까지.

이것은 실제 사례가 아닙니다. 저는이 사슬을 올바르게 읽는 방법을 이해하려고 노력하고 있습니다.이 사건은 저를 혼란스럽게했습니다.

UPD

find블록없이 호출하면 'default'열거자를 반환하는 것이 여러 번 제안 되었으므로 여기에 예가 있습니다.

[1, 2, 3, 4, 5].find
#=> #<Enumerator: [1, 2, 3, 4, 5]:find>

[1, 2, 3, 4, 5].find.each { |x| x < 4 }
#=> 1
로마 인

좋아, 마침내 알아 냈어.

find첫 번째 값이 블록에 의해 처리 된 후 반복이 종료되지 않는 이유 Enumerable 모듈의 일명 메서드 collect_i내의 반복기 또는 호출과 함께 제공된 블록의 반환 값에 관계없이 모든 반복 후에 명시 적으로 반환 하기 때문 입니다. 여기에서 가져온 것입니다 .collectmapnilmapcollectenum.c

static VALUE
collect_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, ary))
{
    rb_ary_push(ary, enum_yield(argc, argv));

    return Qnil;
}

따라서 find초기 배열에 대한 내부 호출은 항상 nil값을 산출 한 결과로 가져 오므 로 마지막 요소가 처리 될 때까지 반복을 중지하지 않습니다. 루비를 아카이브로 다운로드하고이 기능을 다음과 같이 수정하면 쉽게 증명할 수 있습니다.

static VALUE
collect_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, ary))
{
    rb_ary_push(ary, enum_yield(argc, argv));

    return ary;
}

수정 된 소스에서 루비를 저장하고 빌드하면 다음과 같은 결과를 얻습니다.

irb(main):001:0> [1,2,3,4,5].find.map { |x| x*x } => [1]

또 다른 흥미로운 점은 Rubinius가 이와 똑같이 구현된다는 것입니다. collect따라서 MRI와 Rubinius가이 진술에 대해 다른 결과를 생성 할 가능성이 있다고 생각합니다. 지금은 작동하는 Rubinius 설치가 없습니다.하지만 기회가있을 때이를 확인하고 결과로이 게시물을 업데이트하겠습니다.

이것이 호기심을 충족시키는 것 외에는 누구에게나 유용할지 확실하지 않지만 여전히 :)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

문자열이 vbcrlf로 시작하거나 끝나는 지 확인

분류에서Dev

TCL 문자로 시작하는 전체 줄 제거

분류에서Dev

문자열이 두 숫자로 시작하는지 확인-Regex

분류에서Dev

특정 문자열로 시작하는 열 인쇄

분류에서Dev

대괄호로 시작하는 모든 문자열 제거

분류에서Dev

특정 문자로 시작하는 전체 단어를 제거하는 공식

분류에서Dev

인덱스로 시작하는 파이썬 추출 문자열

분류에서Dev

bash, 문자열이 { "nextId"로 시작하는지 확인

분류에서Dev

특정 열에서 숫자로 시작하는 행만 인쇄

분류에서Dev

특정 열에서 숫자로 시작하는 행만 인쇄

분류에서Dev

@로 시작하는 여러 문자열 인식

분류에서Dev

bash : 문자열이 "/ *"로 시작하는지 확인

분류에서Dev

특정 문자열로 시작하는 단어 확인 [SQL Server]

분류에서Dev

열거 형 자체를 배열로 사용하는 방법

분류에서Dev

문자열이 RegExp로 시작하는지 확인하십시오.

분류에서Dev

경로가 문자열로 시작하는지 확인하는 방법

분류에서Dev

문자열이 무언가로 시작하는지 또는 포함하는지 확인하는 함수 작성

분류에서Dev

Scala에서 대문자로 시작하는 문자열의 단어 제거

분류에서Dev

R. B 열이 문자로 시작하는 경우 A 열의 요소 교체

분류에서Dev

확인 문자열이 XSLT에서 숫자 개수로 시작하는 방법

분류에서Dev

슬래시로 묶인 첫 번째 문자열을 제거하는 쉘 명령

분류에서Dev

R에서 \ n 또는 \ U로 시작하는 문자열 제거

분류에서Dev

Python Pandas는 문자열이 다음으로 시작하는 경우 하위 문자열을 대체합니다.

분류에서Dev

문자열에 http (s)가 포함되어 있지 않거나 슬래시로 시작하지 않는지 확인

분류에서Dev

포인트로 시작하는 문자열을 10 진수 값으로 변환

분류에서Dev

Javascript-문자로 시작하지 않는 배열의 요소 제거

분류에서Dev

특정 문자로 시작하거나 끝나서는 안되는 문자열과 일치하는 정규식

분류에서Dev

열거 형과 문자열을 인수로 취하는 제네릭 메소드 작성

분류에서Dev

주어진 문자로 시작하는 부분 문자열을 제거하십시오.

Related 관련 기사

  1. 1

    문자열이 vbcrlf로 시작하거나 끝나는 지 확인

  2. 2

    TCL 문자로 시작하는 전체 줄 제거

  3. 3

    문자열이 두 숫자로 시작하는지 확인-Regex

  4. 4

    특정 문자열로 시작하는 열 인쇄

  5. 5

    대괄호로 시작하는 모든 문자열 제거

  6. 6

    특정 문자로 시작하는 전체 단어를 제거하는 공식

  7. 7

    인덱스로 시작하는 파이썬 추출 문자열

  8. 8

    bash, 문자열이 { "nextId"로 시작하는지 확인

  9. 9

    특정 열에서 숫자로 시작하는 행만 인쇄

  10. 10

    특정 열에서 숫자로 시작하는 행만 인쇄

  11. 11

    @로 시작하는 여러 문자열 인식

  12. 12

    bash : 문자열이 "/ *"로 시작하는지 확인

  13. 13

    특정 문자열로 시작하는 단어 확인 [SQL Server]

  14. 14

    열거 형 자체를 배열로 사용하는 방법

  15. 15

    문자열이 RegExp로 시작하는지 확인하십시오.

  16. 16

    경로가 문자열로 시작하는지 확인하는 방법

  17. 17

    문자열이 무언가로 시작하는지 또는 포함하는지 확인하는 함수 작성

  18. 18

    Scala에서 대문자로 시작하는 문자열의 단어 제거

  19. 19

    R. B 열이 문자로 시작하는 경우 A 열의 요소 교체

  20. 20

    확인 문자열이 XSLT에서 숫자 개수로 시작하는 방법

  21. 21

    슬래시로 묶인 첫 번째 문자열을 제거하는 쉘 명령

  22. 22

    R에서 \ n 또는 \ U로 시작하는 문자열 제거

  23. 23

    Python Pandas는 문자열이 다음으로 시작하는 경우 하위 문자열을 대체합니다.

  24. 24

    문자열에 http (s)가 포함되어 있지 않거나 슬래시로 시작하지 않는지 확인

  25. 25

    포인트로 시작하는 문자열을 10 진수 값으로 변환

  26. 26

    Javascript-문자로 시작하지 않는 배열의 요소 제거

  27. 27

    특정 문자로 시작하거나 끝나서는 안되는 문자열과 일치하는 정규식

  28. 28

    열거 형과 문자열을 인수로 취하는 제네릭 메소드 작성

  29. 29

    주어진 문자로 시작하는 부분 문자열을 제거하십시오.

뜨겁다태그

보관