언어

MethodHandles.Loop(MethodHandle[][]) 메서드

정의

각 반복 시 업데이트되고 검사되는 여러 루프 변수가 있는 루프를 나타내는 메서드 핸들을 생성합니다.

[Android.Runtime.Register("loop", "([[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? Loop(params Java.Lang.Invoke.MethodHandle[][]? clauses);
[<Android.Runtime.Register("loop", "([[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member Loop : Java.Lang.Invoke.MethodHandle[][] -> Java.Lang.Invoke.MethodHandle

매개 변수

clauses
MethodHandle[][]

위에서 설명한 규칙을 준수하는 배열 배열(4개 튜플) MethodHandle입니다.

반품

인수에 정의된 대로 반복 동작을 구현하는 메서드 핸들입니다.

특성

설명

각 반복 시 업데이트되고 검사되는 여러 루프 변수가 있는 루프를 나타내는 메서드 핸들을 생성합니다. 조건자 중 하나로 인해 루프가 종료되면 해당 종료자가 실행되고 결과 핸들의 반환 값인 루프의 결과를 전달합니다.

직관적으로 모든 루프는 하나 이상의 "절"로 구성되며, 각 루프는 로컬 <em>반복 변수</em> 및/또는 루프 종료를 지정합니다. 루프의 각 반복은 각 절을 순서대로 실행합니다. 절은 필요에 따라 반복 변수를 업데이트할 수 있습니다. 또한 필요에 따라 테스트 및 조건부 루프 종료를 수행할 수 있습니다. 메서드 핸들의 관점에서 이 논리를 표현하기 위해 각 절은 루프가 실행되기 전에 최대 4개의 독립적인 작업(<ul><li><em>init:</em>)을 지정합니다. 형식V의 반복 변수 v 를 초기화합니다. <li><em>step:</em> 절이 실행되면 반복 변수 v에 대한 업데이트 단계입니다. <li><em>pred:</em> 절이 실행되면 루프 종료를 테스트하기 위한 조건자 실행입니다. <li><em>fini:</em> 절이 루프 종료를 발생시키는 경우 종료자 실행은 루프의 반환 값을 계산합니다. </ul> 모든 반복 변수 형식의 전체 시퀀스(절 순서)는 .로 (V...)표기됩니다. 값 자체는 다음과 같습니다 (v...). "매개 변수 목록"을 말할 때 일반적으로 형식을 참조하지만 일부 컨텍스트(실행 설명)에서는 목록이 실제 값이 됩니다.

이러한 절 부분 중 일부는 특정 규칙에 따라 생략될 수 있으며 이 경우 유용한 기본 동작이 제공됩니다. 자세한 설명은 아래를 참조하세요.

<em>Parameters optional everywhere:</em> Each 절 함수는 허용되지만 각 반복 변수 v에 대한 매개 변수를 수락할 필요는 없습니다. 예외로 init 함수는 init 함수가 실행될 때 해당 값이 아직 계산되지 않으므로 매개 변수를 사용할 v 수 없습니다. 모든 절 함수는 사용할 수 있는 매개 변수의 후행 하위 시퀀스를 무시합니다. 실제로 절 함수는 인수를 전혀 사용하지 않을 수 있습니다.

<em>루프 매개 변수:</em> A 절 함수는 자격이 있는 모든 반복 변수 값을 사용할 수 있으며, 이 경우 더 많은 후행 매개 변수를 사용할 수도 있습니다. 이러한 추가 값은 em>루프 매개 변수</em>이라고 <하며 해당 형식 및 값은 다음과 같이 (A...)(a...)표기됩니다. 이는 루프가 실행될 때마다 제공될 결과 루프 핸들의 매개 변수가 됩니다. (init 함수는 반복 변수를 v허용하지 않으므로 init 함수에 대한 모든 매개 변수는 자동으로 루프 매개 변수 a입니다.) 반복 변수와 마찬가지로 절 함수는 허용되지만 루프 매개 변수를 수락할 필요는 없습니다. 이러한 루프 매개 변수는 전체 루프에 표시되는 루프 고정 값으로 작동합니다.

<em>매개 변수는 현재 반복 변수 값 및 들어오는 루프 매개 변수의 전체 목록을 (v... a...) 전달할 수 있으므로 모든 위치에< 표시되는 매개 변수:/em> 각 non-init 절 함수는 전체 루프 상태를 관찰할 수 있습니다. init 함수는 초기 프리 루프 상태를 관찰 (a...)할 수 있습니다. 대부분의 절 함수는 이 정보를 모두 필요로 하지 않지만 마치 에 의해 #dropArguments서처럼 공식적으로 연결됩니다. "astar">보다 구체적으로, 표기법을 (V*) 사용하여 전체 시퀀스의 (V...) 임의 접두사를 표현해야 합니다(마찬가지로 (v*), (A*)(a*)). 이 표기법에서 init 함수 매개 변수 목록의 일반적인 형식은 (A*)init이 아닌 함수 매개 변수 목록의 일반적인 형식이거나 (V*)(V... A*)

<em>Checking 절 구조:</em> 절 집합을 지정하면 루프의 모든 부분을 연결하기 위해 수행되는 여러 검사 및 조정이 있습니다. 아래 단계에서 자세히 설명합니다. 이 단계에서는 루프 조합기에 대한 입력에서 필요한 제약 조건을 충족하지 않는 경우 "must"라는 단어가 발생할 때마다 throw되는 위치에 IllegalArgumentException 해당합니다.

<em>효과적으로 동일한 시퀀스:</em> "effid"> 매개 변수 목록은 다른 매개 변수 목록 A 과 실제로 동일하거나 더 짧고 B 적절한 접두B사로 동일할 경우 A 다른 매개 변수 목록 AB 과 실제로 동일><하도록 정의<>됩니다. 순서가 지정되지 않은 매개 변수 목록 집합을 말할 때 집합에 가장 긴 목록이 포함되어 있고 집합의 모든 멤버가 가장 긴 목록과 효과적으로 동일한 경우 집합이 전체적으로 "효과적으로 동일"하다고 가정합니다. 예를 들어 폼 (V*) 의 모든 형식 시퀀스 집합은 사실상 동일하며 폼의 (V... A*) 시퀀스가 더 많이 추가된 경우에도 마찬가지입니다.

<em>0단계: 절 구조를 확인합니다.</em><ol type="a"><li>절 배열(형식 MethodHandle[][])은 비여야null 하며 하나 이상의 요소를 포함해야 합니다. <li>절 배열은 4개보다 긴 s 또는 하위 배열을 포함 null할 수 없습니다. <4개보다 짧은 li>절은 4개의 길이로 요소에 의해 null 패딩된 것처럼 처리됩니다. 패딩은 배열에 요소를 추가하여 발생합니다. <모든 nulls가 있는 li>절은 무시됩니다. <li>Each 절은 "init", "step", "pred" 및 "fini"라는 함수의 4개 튜플로 처리됩니다. </ol>

<em>1A단계: 반복 변수 형식을 확인합니다 (V...).</em><ol type="a"><li>각 절의 반복 변수 형식은 절의 init 및 단계 반환 형식을 사용하여 결정됩니다. <li>두 함수를 모두 생략하면 해당 절에 대한 반복 변수가 없습니다(void 이를 나타내는 형식으로 사용됨). 이 중 하나를 생략하면 다른 반환 형식은 절의 반복 변수 형식을 정의합니다. 둘 다 지정된 경우 공통 반환 형식(동일해야 합니다)은 절의 반복 변수 형식을 정의합니다. <li>반환 형식 목록(절 순서대로)을 구성하여 모든 항목을 생략합니다 void. <li>이 형식 목록을 "반복 변수 형식"((V...))이라고 합니다. </ol>

<em>1B단계: 루프 매개 변수를 확인합니다 (A...).</em><ul><li>검사 및 init 함수 매개 변수 목록(형식 (A*))을 수집합니다. <li>반복 변수 형식을 제거한 후 단계, 사전 및 fini 매개 변수 목록의 접미사를 검사하고 수집합니다. (형식이 있어야 합니다. (V... A*) 파트만 수집합니다 (A*) .) <li>모든 반복 변수 형식으로 시작하지 않는 단계, 사전 및 fini 매개 변수 목록에서 접미사를 수집하지 마세요. (이러한 형식은 모든 절 함수 형식과 함께 2단계에서 확인됩니다.) <li>생략된 절 함수는 무시됩니다. (마찬가지로 빈 매개 변수 목록이 있는 것으로 간주됩니다.) <li>수집된 모든 매개 변수 목록은 효과적으로 동일해야 합니다. <li>가장 긴 매개 변수 목록(반드시 고유)을 "외부 매개 변수 목록"((A...))이라고 합니다. <li>이러한 매개 변수 목록이 없으면 외부 매개 변수 목록이 빈 시퀀스로 이동됩니다. <li>반복 변수 형식과 외부 매개 변수 형식으로 구성된 결합된 목록을 "내부 매개 변수 목록"이라고 합니다. </ul>

<em>1C단계: 루프 반환 형식을 결정합니다.</em><ol type="a"><li>Examine fini 함수 반환 형식, 생략된 fini 함수 무시. <li>fini 함수가 없으면 루프 반환 형식은 .입니다 void. <li>그렇지 않으면 fini 함수의 공통 반환 형식 R (반환 형식은 동일해야 함)은 루프 반환 형식을 정의합니다. </ol>

<em>1D단계: 다른 형식을 확인합니다.</em><ol type="a"><li>에는 생략되지 않은 사전 함수가 하나 이상 있어야 합니다. <li>생략되지 않은 모든 사전 함수에는 반환 형식이 boolean 있어야 합니다. </ol>

<em>2단계: 매개 변수 목록을 확인합니다.</em><ol type="a"><li>결과 루프 핸들에 대한 매개 변수 목록은 외부 매개 변수 목록 (A...)입니다. <li>init 함수의 매개 변수 목록이 외부 매개 변수 목록으로 조정됩니다. (해당 매개 변수 목록은 이미 이 목록과 효과적으로 동일합니다.) <li>생략되지 않은 모든 비 init(step, pred 및 fini) 함수에 대한 매개 변수 목록은 내부 매개 변수 목록 (V... A...)과 효과적으로 동일해야 합니다. </ol>

<em>3단계: 생략된 함수를 채웁니다.</em><ol type="a"><li>init 함수를 생략하면 절의 반복 변수 형식에 #empty 기본값을 사용합니다. <li>단계 함수를 생략하면 절의 반복 변수 형식의 #identity ID 함수를 사용하고, 이전 절의 반복이 아닌void 변수에 대한 ID 함수 매개 변수 앞에 삭제된 인수 매개 변수를 삽입합니다. (그러면 루프 변수가 로컬 루프 고정으로 바뀝니다.) <li>pred 함수를 생략하면 상수 true 함수를 사용합니다. (이 절에 관한 한 루프가 계속 진행됩니다. 이러한 경우 해당 fini 함수에 연결할 수 없습니다.) <li>fini 함수를 생략하면 루프 반환 형식에 #empty 기본값을 사용합니다. </ol>

<em>4단계: 누락된 매개 변수 형식을 입력합니다.</em><ol type="a"><li>이 시점에서 모든 init 함수 매개 변수 목록은 외부 매개 변수 목록 (A...)과 효과적으로 동일하지만 일부 목록은 더 짧을 수 있습니다. 짧은 매개 변수 목록이 있는 모든 init 함수에 대해 목록의 끝을 채 깁니다. <li>이 시점에서 모든 비-init 함수 매개 변수 목록은 내부 매개 변수 목록 (V... A...)과 사실상 동일하지만 일부 목록은 더 짧을 수 있습니다. 짧은 매개 변수 목록이 있는 모든 non-init 함수에 대해 목록의 끝을 채 깁니다. <li>인수 목록은 사용되지 않는 후행 인수를 삭제하는 #dropArgumentsToMatch(MethodHandle, int, List, int)에 의해 채워집니다. </ol>

<em>최종 관찰.</em><ol type="a"><li>이러한 단계 후에는 생략된 함수와 인수를 제공하여 모든 절이 조정되었습니다. <li>모든 init 함수에는 최종 루프 핸들에도 포함되는 공통 매개 변수 형식 목록이 (A...)있습니다. <li>All fini 함수에는 최종 루프 핸들에도 포함되는 공통 반환 형식 R이 있습니다. <li>모든 non-init 함수에는 루프 매개 변수 뒤에 (비void) 반복 변수의 공통 매개 변수 형식 목록이 (V... A...)있습니다V. <li>init 및 단계 함수의 각 쌍은 반환 형식 V에 동의합니다. <li>각 non-init 함수는 모든 반복 변수의 현재 값을 (v...) 관찰할 수 있습니다. <li>모든 함수는 모든 루프 매개 변수의 들어오는 값을 (a...) 관찰할 수 있습니다. </ol>

<em>예제입니다.</em> 위의 1A단계의 결과로 결합 loop 자에는 다음과 같은 속성 <이 있습니다. ul><li>Given N clauses Cn = {null, Sn, Pn} with n = 1..N. <li>조건자 핸들이 Pn 매개 변수이거나 null 매개 변수가 없다고 가정합니다. (하나 Pn 만 비null이어야 합니다.) <li>Suppose 단계 핸들에는 Sn 일부 상수X>=N에 대한 서명이 있습니다(B1..BX)Rn. <li>Suppose Q 는 void가 아닌 형식 Rn의 개수이며 (V1...VQ) 해당 형식의 시퀀스입니다. <li>그것은 에 대한 n = 1..min(X,Q)것이 Vn == Bn 어야합니다. <li>매개 변수 형식 Vn 은 루프 로컬 상태 요소 (V...)로 해석됩니다. <li>나머지 형식 BQ+1..BX (if Q<X)은 결과 루프 핸들의 매개 변수 형식을 결정합니다 (A...). </ul> 이 예제에서 루프 핸들 매개 변수 (A...) 는 단계 함수에서 파생되었으며, 이는 대부분의 루프 계산이 단계에서 발생하는 경우 자연스러운 일입니다. 일부 루프의 경우 계산 부담이 사전 함수에서 가장 무거울 수 있으므로 사전 함수는 루프 매개 변수 값을 수락해야 할 수 있습니다. 복잡한 종료 논리가 있는 루프의 경우 fini 함수는 루프 매개 변수를 수락해야 할 수 있으며, 마찬가지로 init 함수에 추가 매개 변수가 필요한 복잡한 입력 논리가 있는 루프의 경우와 마찬가지로 사용할 수 있습니다. 이러한 이유로 이러한 매개 변수를 결정하는 규칙은 모든 절 부분에서 가능한 대칭입니다. 일반적으로 루프 매개 변수는 전체 루프에서 일반적인 고정 값으로 작동하지만 반복 변수는 일반적인 변형 값으로 작동하거나(단계 함수가 없는 경우) 내부 루프 고정 임시로 작동합니다.

<em>루프 실행.</em><ol type="a"><li>루프가 호출되면 루프 입력 값이 모든 절 함수에 전달되도록 로컬에 저장됩니다. 이러한 로컬은 루프 고정입니다. <li>각 init 함수는 절 순서로 실행되고(외부 인수 (a...)전달) 비값void 은 (반복 변수 (v...)로) 로컬에 저장됩니다. 이러한 로컬은 루프가 달라집니다(위에서 설명한 대로 해당 단계가 ID 함수로 동작하지 않는 한). <li>모든 함수 실행(init 함수 제외)은 반복void 이 아닌 값 (v...) (절 순서)과 루프 입력(인수 순서)으로 구성된 내부 매개 변수 목록을 전달합니다 (a...) . <li>단계 및 pred 함수는 pred 함수가 반환 false될 때까지 절 순서(미리 정해진 단계)로 실행됩니다. <li>단계 함수 호출의 비void 결과는 루프 변수 시퀀스에서 (v...) 해당 값을 업데이트하는 데 사용됩니다. 업데이트된 값은 모든 후속 함수 호출에 즉시 표시됩니다. <li>pred 함수가 반환 false되면 해당 fini 함수가 호출되고 결과 값(형식 R)이 루프 전체에서 반환됩니다. <li>모든 pred 함수가 항상 true를 반환하면 fini 함수가 호출되지 않으며 예외를 throw하는 것 외에는 루프가 종료될 수 없습니다. </ol>

<em>사용량 팁.</em><ul><li>각 단계 함수는 루프 변수에 대한 em>all</em>의 <현재 값을 수신하지만 때로는 단계 함수가 자체 변수의 현재 값만 관찰하면 됩니다. 이 경우 단계 함수는 모든 이전 루프 변수를 삭제할 #dropArguments 명시적으로 해야 할 수 있습니다. 이렇게 하려면 다음과 같은 dropArguments(step, 0, V0.class, ...)식에서 해당 형식을 언급해야 합니다. <li>루프 변수는 다를 필요가 없습니다. 루프 고정 변수일 수 있습니다. 절은 단계, pred 또는 fini 함수 없이 적합한 init 함수에 의해 루프 고정을 만들 수 있습니다. 이는 들어오는 루프 인수를 인접 루프 변수의 단계 또는 사전 함수로 "연결"하는 데 유용할 수 있습니다. <li>절 함수 중 일부가 인스턴스의 가상 메서드인 경우 }와 같은 new MethodHandle[]{identity(ObjType.class)초기 절을 사용하여 인스턴스 자체를 초기 고정 루프 "variable"에 편리하게 배치할 수 있습니다. 이 경우 인스턴스 참조는 첫 번째 반복 변수 값이 되며, 가상 메서드를 절 부분으로 사용하기 쉽습니다. 이러한 메서드는 모두 해당 값과 일치하는 선행 인스턴스 참조를 사용하므로 쉽게 사용할 수 있습니다. </ul>

결과 루프 핸들에 대한 의사 코드는 다음과 같습니다. 위 Vv 같이 루프 변수 A 의 형식과 값을 나타내고 a 전체 루프에 전달된 인수를 나타내며 R 결과 루프뿐만 아니라 모든 종료자의 공통 결과 형식입니다. <blockquote>

{@code
            V... init...(A...);
            boolean pred...(V..., A...);
            V... step...(V..., A...);
            R fini...(V..., A...);
            R loop(A... a) {
              V... v... = init...(a...);
              for (;;) {
                for ((v, p, s, f) in (v..., pred..., step..., fini...)) {
                  v = s(v..., a...);
                  if (!p(v..., a...)) {
                    return f(v..., a...);
                  }
                }
              }
            }
            }

</blockquote> 개별 절 함수가 모두 사용하는 것을 소홀히 할 수 있더라도 매개 변수 형식이 나열 (V...) 되고 (A...) 전체 길이로 확장되었습니다. 위에서 설명한 것처럼 누락된 매개 변수는 다음과 #dropArgumentsToMatch(MethodHandle, int, List, int)같이 채워집니다.

9에 추가되었습니다.

에 대한 java.lang.invoke.MethodHandles.loop(java.lang.invoke.MethodHandle[]...)Java 설명서

이 페이지의 일부는 만들고 공유한 작업을 기반으로 하며 에 설명된 조건에 따라 사용됩니다.

적용 대상