선행 작업의 결과가 다음 작업으로 전달되는 흐름을 코드에 명시적으로 드러내고자 할 때 파이프라인을 사용합니다. left |> right 구문은 좌변을 한 번만 평가하여 저장합니다. 그다음 정해진 규칙에 따라 해당 값을 우변으로 전달합니다. _는 저장된 값이 전달될 호출 인수 위치를 지정합니다.
외부 이름에 기대지 않는 파이프라인
다음 코드를 pipelines-placeholders.tpz로 저장하세요.
function 더하기(값: int, 양: int) -> int {
값 + 양
}
function 곱하기(왼쪽: int, 오른쪽: int) -> int {
왼쪽 * 오른쪽
}
function 같음(왼쪽: int, 오른쪽: int) -> bool {
왼쪽 == 오른쪽
}
let 결과 = 5
|> 더하기(2)
|> 곱하기(_, 3)
let 반복비교 = 결과 |> 같음(_, _)
print("{결과} {반복비교}")검사하고 실행합니다.
topaz check pipelines-placeholders.tpz
topaz run pipelines-placeholders.tpz출력은 다음과 같습니다.
21 true첫 번째 단계에는 _가 없습니다. 따라서 저장된 5가 첫 번째 인수로 전달되어 더하기(5, 2)가 됩니다. 두 번째 단계는 저장된 7이 들어갈 위치를 직접 지정하여 곱하기(7, 3)가 됩니다. 마지막 파이프라인 단계에서는 두 _가 모두 동일한 저장값 21을 받으므로 같음(21, 21)과 동일하게 동작합니다. 자리표시자가 추가로 존재하더라도 좌변을 다시 평가하지는 않습니다.
오른쪽 형태에 따른 네 가지 선택
| 오른쪽 형태 | 뜻 |
|---|---|
value |> call(other) | value를 모든 명시적 위치·펼침·이름 인수보다 앞에 삽입 |
value |> call(_, other) | 유효한 모든 _ 인수를 value로 교체하며 추가 삽입은 하지 않음 |
value |> callable | 호출 가능 값에 value 하나를 전달 |
value |> .field | value에서 field를 읽음 |
파이프라인은 왼쪽에서 오른쪽으로 결합합니다. 따라서 각 단계는 직전 단계가 완료한 연산 값을 전달받습니다. 자리표시자는 자신을 감싼 가장 가까운 호출에 귀속됩니다. 패턴 안의 _는 값을 무시하는 와일드카드입니다. 토큰 형태만 동일할 뿐 역할과 스코프가 서로 다릅니다.
호출 인수 위치라면 _를 하나 이상 쓸 수 있습니다. 자리표시자는 모두 동일하게 저장된 값을 전달받습니다. 자리표시자가 하나라도 존재하면 교체 규칙이 먼저 적용되어 첫 번째 인수에 값을 추가로 삽입하지 않습니다.
흔한 실수 고치기
_ 단독으로는 독립된 값이 되지 못합니다. 파이프라인 우변 전체·호출할 함수 이름·멤버 이름·필드 이름 위치에는 사용할 수 없습니다. 파이프라인으로 전달한 값을 수신할 호출의 인수 목록 안에 두세요.
value |> ?.field 같은 선택적 필드 축약 표현은 지원하지 않습니다. 일반 선택적 체이닝을 먼저 쓰거나 람다 안에서 직접 처리하세요. 이름 지정 인수는 파이프라인으로 결합한 뒤에도 위치 인수와 펼침 인수 뒤에 와야 합니다. 우변이 호출·호출 가능 값·.field 중 어느 것도 아니면 정적 오류입니다.
파이프라인은 Result를 자동으로 전파하지 않습니다. 부분 적용을 생성하지 않으며 작업을 임의로 비동기로 전환하지도 않습니다. Result 전파에는 후위 ?를 사용합니다. 제한된 동시 작업에는 concurrent를 직접 적습니다.
우선순위는 연산자와 표현식에서 이어집니다. 호출 가능 값은 함수와 제네릭을 참고하세요. 컬렉션을 만드는 단계는 컬렉션과 컴프리헨션에서 다룹니다.