Это как если бы я сказал вам поднять руку, как только произнесу четвертое от последнего слова, которое я собираюсь сказать. Я не собираюсь говорить вам заранее, сколько слов я собираюсь сказать.
Труба - это поток. Его данные не имеют размера, у него есть только операции по извлечению из него следующего элемента и / или вставке в него элемента, и результатом является либо фрагмент данных, либо сигнал о том, что данных больше нет.
Таким образом, если вы сначала не извлечете все данные из потока, не поместите их в буфер, не подсчитаете их длину, не перемотаете поток и затем не получите на четыре элемента меньше, это невозможно сделать.
РЕДАКТИРОВАТЬ: мне нужно делать больше продумывать вещи, вместо того, чтобы придумывать умные аналогии :) Поток не говорит "немедленно остановить меня n элементов до последнего", а скорее "передать все элементы, кроме последнего n", и путем буфер из только n элементов, и ожидание, пока первые n элементов не будут получены, прежде чем передать первый, возможно. Очевидно, что это не сработает в таких ситуациях, как телекоммуникации, когда вы хотите, чтобы данные отправлялись сразу после их получения, как вы могли бы, если бы вам нужны были первые n элементов. И я предполагаю, что truncate
не делает это таким образом.
(попытка понизить самооценку -1)