Идиоматическое решение
Создайте признак, который сдерживает параметр T
в foo
, реализует любое конкретное поведение как ассоциированную функцию этого признака.
Пример:
trait PrintMe {
fn print_me(&self);
}
impl PrintMe for String {
fn print_me(&self) { println!("I am a string"); }
}
struct Foo {
zaz: String,
bar: T
}
fn main() {
// ...
x.bar.print_me();
}
Это принципиальное общее программирование, где вы точно определяете разницу в поведении возможных общих параметров, так что нет ничего удивительного.
Точное решение
Rust действительно может запрашивать типы: каждый тип имеет уникальный TypeId
, и вы можете сопоставлять TypeId
с серией проверок if
, Это неуклюже.
fn print_me(x: &Foo) {
if TypeId::of::() == TypeId::of::() {
println!("I am a string");
} else // ...
}
Но, пожалуйста ... не делайте этого:)
x.numpy (), y.numpy () преобразует 'x' и 'y' в массивы numpy.