Передача типа переменной в качестве параметра функции в rust? - PullRequest
0 голосов
/ 21 апреля 2020

Можно ли передать примитивный тип (например, i32) в качестве аргумента функции. Например, я хочу прочитать пользовательский ввод и сохранить его в выбранном мной векторе с помощью функции

use std::io;
fn main()
{
get_vectorized_line(i32) ;  
}

fn get_vectorized_line(expected_type: type)->Vec<expected_type>{
    let mut line_content=String::new();
    io::stdin().read_line(&mut line_content).expect("Could not read line");
    let vectorized_line: Vec<expected_type> = line_content.trim().split(" ").
    map(|s| s.parse().expect("Could not parse")).collect();
    return vectorized_line;
}

, отвечающей на expected value, found builtin type i32 при вызове функции.

Я знаю можно передавать типы в качестве аргументов в Python, (а не в стандартном C без использования макросов ).

Я полагаю, что мог бы использовать generi c функции делать то, что я хочу. Но я хотел ясности в этом топи c

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Если вам действительно нравится синтаксис передачи типа в качестве аргумента:

macro_rules! gvl {
    ($t:ty) => {{
        let mut content = String::new();
        std::io::stdin().read_line(&mut content).unwrap();
        content.trim().split(' ').map(
            |s| s.parse::<$t>().unwrap()
        ).collect::<Vec<$t>>()
    }}
}

И тах-да:

let _ = gvl!(i32);

Никаких внешних аннотаций типов не требуется!


Пожалуйста, не делайте этого на самом деле

Используйте первоклассные типы со специальным синтаксисом, который (почти) соответствует вашему желанию:

let _ = gvl::<i32>();
fn gvl<T: FromStr>() -> Vec<T> where <T as FromStr>::Err: Debug {
    let mut content=String::new();
    stdin().read_line(&mut content).unwrap();
    content.trim().split(' ').map(
        |s| s.parse().unwrap()
    ).collect()
}
1 голос
/ 22 апреля 2020

Вы можете использовать дженерики для типов возврата. Здесь шаблон c T должен реализовывать FromStr (потому что он анализируется из str) и должен отображаться (для возможного сообщения pani c).

use std::io;

fn get_vectorized_line<T: std::str::FromStr>()->Vec<T> where <T as std::str::FromStr>::Err: std::fmt::Debug {
    let mut line_content=String::new();
    io::stdin().read_line(&mut line_content).expect("Could not read line");
    line_content.trim().split(' ').map(|s| s.parse().unwrap()).collect()
}

fn main()
{
    let vectorized_line: Vec<i32> = get_vectorized_line() ;  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...