Я думаю, что проблема может быть больше в сигнатуре compare_to_smth
.
fn compare_to_smth<'a, T>(value: &'a T) // this implies a T: 'a bound
// because otherwise we would not be able to
// have a &'a T (references can't live longer
// than the thing they reference)
, но затем внутри функции, которую вы выполняете:
let smth_value: T = Read::read(mem).unwrap();
// give me something of type T that
// lives less than T
Я могу быть неправ, но я не думаю, что это зависит от того, как определяется Read
и насколько сложна система типов в будущем, так как все, что вы пишете с правой стороны, не изменяет того факта, что вы ожидаете T на левой стороне (и T должен пережить 'a
).
«Достаточно умный компилятор» мог бы видеть, что smth_value на самом деле не дольше 'a
и что вы " это безопасно, но в целом это будет небезопасно. Я уверен, что использование небезопасной трансмутации в compare_to_smth
полностью победит вашу цель, но для демонстрации это работает:
fn compare_to_smth<'a, T>(value: &'a T) -> bool
where T: Read<'a> + PartialEq
{
let mem: &[u8] = &[0x01, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37];
let smth_value = <U8AndStr as Read>::read(mem).unwrap();
let vl: &U8AndStr = unsafe{ std::mem::transmute(value) };
smth_value == *vl
}
Я просто не могу понять, почему это возвращает NULL, а не 0.
blockquote>Мы можем только догадываться, не видя вывода журнала; но, скорее всего, возвращаемое значение равно нулю, поскольку вместо этого возникла ошибка.
Необходимо убедиться, что ошибки обрабатываются при вызове функции, прежде чем пытаться использовать возвращаемое значение.