В общем, я предпочитаю писать функции инициализатора с описательными именами. Однако для некоторых структур существует очевидная функция инициализации по умолчанию. Стандартное имя Rust для такой функции - new
, размещенное в блоке impl
для структуры. Однако сегодня я понял, что могу дать функции такое же имя, что и структура, и подумал, что это будет хороший способ реализовать очевидную функцию инициализации. Например:Функция с тем же именем, что и структура
#[derive(Debug, Clone, Copy)]
struct Pair<T, U> {
first: T,
second: U,
}
#[allow(non_snake_case)]
fn Pair<T, U>(first: T, second: U) -> Pair<T, U> {
Pair::<T, U> {
first: first,
second: second,
}
}
fn main(){
let x = Pair(1, 2);
println!("{:?}", x);
}
Это, на мой взгляд, гораздо более привлекательным, чем это:
let x = Pair::new(1, 2);
Однако, я никогда не видел, чтобы кто-то другой сделает это, и мой вопрос просто, если есть любые проблемы с этим подходом. Существуют ли, например, неоднозначности, которые он может вызвать, которые не будут присутствовать при реализации new
?
Вы предполагаете правильно. Это был первый простой пример, который появился у меня в голове. Возможно, лучшим примером может быть структура «Point», где вам нужны именованные члены (x, y и z). Однако это не должно быть простой структурой. Кандидатом будет даже нечто вроде 'Vec', из стандартной библиотеки, где' new' создает пустой контейнер. –
@BenjaminLindley: Я добавил еще несколько объяснений, объясняющих whys и wherefores. –