next-handle
next-handle (다음 소스 핸들로 전환)
여러 파일을 마치 하나처럼 이어 읽는 IO::CatHandle을 쓰다 보면, 한 파일이 끝나고 다음 파일로 넘어갈 때가 있어요. 그 전환을 직접 제어하고 싶다면 next-handle 메서드를 호출하면 돼요.
본문
IO::CatHandle에서
method next-handle(IO::CatHandle:D: --> IO::Handle:D)
활성 소스 핸들을 소스 핸들 큐의 다음 핸들로 전환해요. 여기서 소스 핸들 큐는 .new의 @handles 속성으로 준 소스들이에요. 반환값은 현재 활성 소스 핸들이고, 소스 핸들 큐가 모두 소진됐다면 Nil이에요.
Cool 소스 "핸들"은 IO::Path로 강제 변환돼요. IO::Path와 아직 열리지 않은 IO::Handle 소스 핸들은 호출자의 $.nl-in, $.chomp, $.encoding 속성을 사용해 읽기용으로 열어요. 이미 열려 있는 IO::Handle 객체의 같은 속성들은 호출자의 속성 값으로 바뀌어요.
이 메서드는 CatHandle의 메서드가 다음 소스 핸들로의 전환을 필요로 할 때마다 자동으로 호출되고, .on-switch Callable을 트리거하며, .new 호출 중에 한 번 호출돼요. .on-switch는 소스 핸들 큐가 소진된 뒤에도 이 메서드가 호출될 때마다 계속 트리거돼요. 일반적으로 현재 활성 소스 핸들의 EOF에 도달하는 것 자체가 .next-handle 호출을 트리거하는 게 아니라, 더 많은 데이터가 필요한 추가 읽기 연산이 트리거한다는 점을 기억하세요.
(my $f1 = 'foo'.IO).spurt: "a\nb";
(my $f2 = 'bar'.IO).spurt: "c\nd";
with IO::CatHandle.new: :on-switch{ say '▸ Switching' }, $f1, $f2 {
say 'one';
.next-handle.^name.say;
say 'two';
.next-handle.^name.say;
say 'three';
.next-handle.^name.say;
# OUTPUT:
# ▸ Switching
# one
# ▸ Switching
# IO::Handle
# two
# ▸ Switching
# Nil
# three
# ▸ Switching
# Nil
}