2013-12-03 2 views
6

Предположим, у меня есть характеристика ржавчины, которая содержит функцию, которая не принимает параметр self &. Есть ли способ вызвать эту функцию на основе типичного параметра типа конкретного типа, который реализует эту черту? Например, в функции get_type_id ниже, как мне успешно вызвать функцию type_id() для свойства CustomType?Rust invoke trait method on generic type parameter

pub trait TypeTrait { 
    fn type_id() -> u16; 
} 

pub struct CustomType { 
    // fields... 
} 

impl TypeTrait for CustomType { 
    fn type_id() -> u16 { 0 } 
} 

pub fn get_type_id<T : TypeTrait>() { 
    // how? 
} 

Спасибо!

+0

Учитывая конкретный случай использования описано здесь, вы можете быть заинтересованы в поиске на [ 'станд :: any'] (HTTP: // статические .rust-lang.org/DOC/ведущий/станд/любой/index.html). –

ответ

7

Как уже упоминалось Aatch, это не возможно в настоящее время. Обойти это можно использовать фиктивный параметр, чтобы указать тип Self:

pub trait TypeTrait { 
    fn type_id(_: Option<Self>) -> u16; 
} 

pub struct CustomType { 
    // fields... 
} 

impl TypeTrait for CustomType { 
    fn type_id(_: Option<CustomType>) -> u16 { 0 } 
} 

pub fn get_type_id<T : TypeTrait>() { 
    let type_id = TypeTrait::type_id(None::<T>); 
} 
+1

Хорошее обходное решение, не подумал об этом сам. Будет использовать это сейчас, пока поддержка Руста не улучшится! – LorenVS

4

К сожалению, в настоящее время это невозможно. Раньше это было основано на деталях реализации, однако это было устранено в пользу, в конечном счете, реализации надлежащего способа сделать это.

Когда это будет реализовано, оно может выглядеть примерно так: TypeTrait::<for T>::type_id(), однако в настоящее время нет синтаксиса, установленного в камне.

Это известный случай и тот, который полностью предназначен для поддержки, просто несчастливо, что в настоящее время это невозможно.

Полное обсуждение по этой теме (так называемые связанные с ним методы) здесь: https://github.com/mozilla/rust/issues/6894 и здесь: https://github.com/mozilla/rust/issues/8888

+0

Спасибо за информацию, будет приятно видеть это в Rust когда-нибудь. Тем не менее, ответ идет к парню, который предоставил простой обходной путь! – LorenVS