[英]How can I define a generic function that can return a given integer type?
我想定義一個 function ,它可以返回一個在調用 function 時指定類型的數字。 function 采用緩沖區( Vec<u8>
)並返回數值,例如
let byte = buf_to_num<u8>(&buf);
let integer = buf_to_num<u32>(&buf);
緩沖區包含一個代表數字的 ASCII 字符串,例如b"827"
,其中每個字節是一個數字的 ASCII 碼。
這是我的非工作代碼:
extern crate num;
use num::Integer;
use std::ops::{MulAssign, AddAssign};
fn buf_to_num<T: Integer + MulAssign + AddAssign>(buf: &Vec::<u8>) -> T {
let mut result : T;
for byte in buf {
result *= 10;
result += (byte - b'0');
}
result
}
對於加法和乘法行( expected type T, found u32
),我得到不匹配的類型錯誤。 所以我想我的問題是如何告訴類型系統T
可以用文字10
或(byte - b'0')
的結果來表示?
歡迎享受將您使用的每一個操作都指定為泛型的樂趣。 這是一種痛苦,但它是值得的。
你有兩個問題:
result *= 10;
沒有相應的From<_>
定義。 這是因為,當您指定“10”時,編譯器無法知道“10”作為T
的含義 - 它知道原始類型以及您通過實現From<_>
特征定義的任何轉換為此,我們需要做兩個假設:
我們將需要From<u32>
以便我們可以將我們的數字限制為u32
我們還將闡明您的邏輯並將每個u8
轉換為char
以便我們可以使用to_digit()
將其轉換為u32
,然后再使用From<u32>
獲取T
。
use std::ops::{MulAssign, AddAssign}; fn parse_to_i<T: From<u32> + MulAssign + AddAssign>(buf: &[u8]) -> T { let mut buffer:T = (0 as u32).into(); for o in buf { buffer *= 10.into(); buffer += (*o as char).to_digit(10).unwrap_or(0).into(); } buffer }
你可以讓自己相信它在操場上的行為
乘法是通過將常量強制轉換為u8
來解決的,這使其受益於我們對From<u8>
對 T 的要求,並允許 rust 編譯器知道我們沒有做傻事。
最后的更改是將result
設置為默認值 0。
讓我知道這對您是否有意義(或者如果沒有),如果有問題,我會很高興進一步闡述:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.