К сожалению, то, что вы хотите сделать, в Rust на данный момент невыразимо.
Подпись Read
, которая на самом деле будет работать, выглядит следующим образом (в псевдо-ржавчине):
trait<'r> Read for Self<'r> {
fn read<'a>(mem: &'a [u8]) -> Result<Self<'a>, String>; // '
}
То есть, Self
должен быть более высоким типом в своем параметре времени жизни. Это требует поддержки более высокосортных типов, что является очень желательной особенностью в сообществе Rust, но которая еще не реализована.
Проблема с исходной сигнатурой:
trait Read<'a> {
fn read(mem: &'a [u8]) -> Result<Self, String>;
}
заключается в том, что 'a
является параметром для характеристики. Если этот признак используется как привязка к значению:
fn compare_to_smth<'a, T>(value: &T) -> bool where T: PartialEq+Read<'a>
, это означает, что вызывающая сторона этой функции выбирает фактический параметр времени жизни. Например, вызывающий может выбрать 'static
:
fn compare_to_smth<T>(value: &T) -> bool where T: PartialEq+Read<'static>
Однако функция использует &[u8]
, чье время жизни не 'static
.
Фактически, этот конкретный пример может быть не совсем корректным из-за дисперсии (я думаю, для этой жизни было бы здорово 'static
здесь, но дисперсия времени жизни сама по себе несколько запутанна, поэтому я не уверен), но, тем не менее, общая идея - это то же: для того, чтобы это работало, метод Read::read
должен быть полиморфным в течение жизни его аргумента и результата, но вы еще не можете написать такую подпись.
Вы можете использовать метакласс, который переопределяет метод __str__
базового класса объекта класса, type
:
class meta(type):
def __str__(cls):
return cls.__name__
class A(metaclass=meta):
pass
print(str(A))
Это выводит:
A