
Size: a a a
Self
(как, например, Default::default
), а воспользоваться синтаксисом турборыбы нельзя, потому что тип не имеет имени, которое можно написать (скажем, если вы получили это значение из функции, возвращающей impl Trait
). Как же поступить в подобном случае? Сделать метод на значении самому!trait WithTypeMethod {
fn method(arg: i32);
}
impl WithTypeMethod for () {
fn method(arg: i32) {
println!("Called `<() as WithTypeMethod>::method` with arg = {}", arg)
}
}
fn make_it() -> impl WithTypeMethod + Default {
()
}
WithTypeMethod
extension trait с методом, принимающим &self
, который просто вызывает Type::method
с нужным аргументом:trait LowerToInstance: WithTypeMethod {
fn instance_method(&self, arg: i32);
}
impl<T: WithTypeMethod> LowerToInstance for T {
fn instance_method(&self, arg: i32) {
T::method(arg)
}
}
let it = make_it();
LowerToInstance::instance_method(&it, 42);
let it = make_it();
(&&&&&&&it).instance_method(18);
Ymd
, заставляет вызывать Date::as_ymd
даже в том случае, если используется только одно из значений месяц или день — а переход на Ymd
был совершён именно по соображениям производительности! У меня есть идеи, как можно решить этот недостаток, но... Это потребует несколько более тяжёлой ти́повой наркомании, так что это материал для следующей статьи.Year
, Month
и Day
), которые описывают, нужна ли этому форматировщику эта часть даты или нет — фактически, этими типами могут быть только Reqired
и Optional
. Главный метод для форматирования принимает на вход сам форматировщик, буфер и некий обобщённый провайдер, про который известно только то, что он даёт доступ к полям, нужным для форматировщика. В типах это выражается тем, что это обобщённый тип, удовлетворяющий трейту Satisfies<Self::Year, Self::Month, Self::Day>
. Второй метод принимает на вход форматировщик, буфер и дату и имеют реализацию по умолчанию, которая создаёт провайдер данных из даты (именно в этот момент применяется оптимизация с вызовом month_day
вместо month
и day
по отдельности) и вызывает на форматировщике первый метод.