값을 소비하는 API는 실패했을 때 그 값이 어떻게 되는지 정해야 합니다. String::from_utf8는 Vec<u8>를 값으로 받고, 실패하면 오류가 그것을 소유합니다.
fn main() {
let bytes = vec![b'o', b'k', 0xff, b'!'];
match String::from_utf8(bytes) {
Ok(s) => println!("{s}"),
Err(e) => {
let at = e.utf8_error().valid_up_to();
let bytes = e.into_bytes();
println!("bad byte at {at}, {} bytes back", bytes.len());
}
}
}
출력은 bad byte at 2, 4 bytes back입니다. 복사가 없고, 호출자는 버퍼와 오프셋을 한 값으로 돌려받습니다. mpsc::Sender::send도 같습니다. SendError가 전달하지 못한 메시지를 담고 있습니다.
다른 방식은 실패만 설명하는 오류이고, 그러면 값은 호출 안에서 버려집니다. 작은 값이라면 괜찮습니다. 큰 버퍼라면 호출자는 시도할 때마다 미리 복제하거나 실패 경로에서 데이터를 잃게 되고, 어느 쪽도 시그니처에는 나타나지 않습니다.
표준 라이브러리에서 값을 소비하고 오류가 나면 버리는 API가 또 무엇이 있습니까? 짧은 목록이 있으면 제 인터페이스를 거기에 대조해 보겠습니다.