2015-08-26 4 views
0

В общем, я предпочитаю писать функции инициализатора с описательными именами. Однако для некоторых структур существует очевидная функция инициализации по умолчанию. Стандартное имя 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?

ответ

3

Если вы хотите использовать Pair(T, U) то вам следует использовать кортеж-структуру вместо:

#[derive(Debug, Clone, Copy)] 
struct Pair<T, U>(T, U); 

fn main(){ 
    let x = Pair(1, 2); 
    println!("{:?}", x); 
    println!("{:?}, {:?}", (x.0, x.1)); 
} 

Или y'know, только кортеж ((T, U)). Но я полагаю, что Pair не ваш фактический прецедент.


Было время, когда идентично названные функции были конвенцией для конструкторов по умолчанию; С течением времени эта конвенция вышла из моды. В настоящее время считается плохой формой, вероятно, в основном для согласованности. Если у вас есть структура (или вариант) кортежа Pair(T, U), вы можете использовать Pair(first, last) в шаблоне, но если у вас есть Pair { first: T, last: U }, вам нужно будет использовать что-то более похожее на Pair { first, last } в шаблоне, и поэтому ваша функция Pair(first, last) будет несовместима с шаблон. В целом считается, что эти типы функций верблюда должны быть зарезервированы исключительно для структур кортежей и вариантов кортежей, где можно быть уверенным, что он действительно отражает то, что содержится в структуре данных без дальнейшей обработки или магии.

+0

Вы предполагаете правильно. Это был первый простой пример, который появился у меня в голове. Возможно, лучшим примером может быть структура «Point», где вам нужны именованные члены (x, y и z). Однако это не должно быть простой структурой. Кандидатом будет даже нечто вроде 'Vec', из стандартной библиотеки, где' new' создает пустой контейнер. –

+0

@BenjaminLindley: Я добавил еще несколько объяснений, объясняющих whys и wherefores. –

Смежные вопросы