Как указать строковое представление для класса

К сожалению, то, что вы хотите сделать, в 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 должен быть полиморфным в течение жизни его аргумента и результата, но вы еще не можете написать такую ​​подпись.

3
задан Dmitriy 4 March 2019 в 02:05
поделиться

1 ответ

Вы можете использовать метакласс, который переопределяет метод __str__ базового класса объекта класса, type:

class meta(type):
    def __str__(cls):
        return cls.__name__

class A(metaclass=meta):
    pass

print(str(A))

Это выводит:

A
0
ответ дан blhsing 4 March 2019 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: