簡體   English   中英

如何定義可以返回給定 integer 類型的通用 function ?

[英]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')的結果來表示?

歡迎享受將您使用的每一個操作都指定為泛型的樂趣。 這是一種痛苦,但它是值得的。

你有兩個問題:

  1. result *= 10; 沒有相應的From<_>定義。 這是因為,當您指定“10”時,編譯器無法知道“10”作為T的含義 - 它知道原始類型以及您通過實現From<_>特征定義的任何轉換
  2. 您正在混合兩個操作 - 從字符向量強制轉換為 integer,以及您的操作。

為此,我們需要做兩個假設:

  • 我們將需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM