數字:u8i8u16i16u32i32u64i64u128i128isizeusizef32f64

T 參數&T 參數&mut T 參數T 回傳值Option<T> 參數Option<T> 回傳值JavaScript 表示法
JavaScript 數字或 bigint 值

JavaScript 的 Number 底層是 64 位元浮點數值,無法精確表示 Rust 的所有數值型別。wasm-bindgen 將自動使用 BigIntNumber 在 JavaScript 中精確表示 Rust 的數值型別

  • u8i8u16i16u32i32isizeusizef32f64 將在 JavaScript 中表示為 Number
  • u64i64u128i128 將在 JavaScript 中表示為 BigInt

注意:Wasm 目前是 32 位元架構,因此 isizeusize 是 32 位元整數,並且「符合」 JavaScript 的 Number

注意u128i128 需要 wasm-bindgen 版本 0.2.96 或更高版本。

從 JavaScript 轉換為 Rust

wasm-bindgen 將自動處理 JavaScript 數字轉換為 Rust 數值型別。轉換規則如下

Number 轉換為 u8i8u16i16u32i32isizeusize

如果 JavaScript 數字是 Infinity-InfinityNaN,則 Rust 值將為 0。否則,JavaScript 數字將向零捨去(請參閱 Math.truncf64::trunc)。如果捨去後的數字對於目標整數型別而言太大或太小,它將會環繞。

例如,如果目標型別是 i8,Rust 將針對以下輸入看到以下值

JS 輸入數字Rust 值 (i8)
4242
-42-42
1.9991
-1.999-1
127127
128-128
255-1
2560
-00
±Infinity0
NaN0

這與將 JavaScript 的 Number 指定給 JavaScript 中適當整數型別的 類型化陣列 的行為相同,即 new Uint8Array([value])[0]

除了處理 Infinity-Infinity 之外,這與 轉換 f64 為 Rust 中適當整數型別的行為相同,即 value_f64 as u32

BigInt 轉換為 u64i64u128i128

如果 JavaScript BigInt 對於目標整數型別而言太大或太小,它將會環繞。

這與將 JavaScript 的 BigInt 指定給 JavaScript 中 64 位元整數型別的 類型化陣列 的行為相同,即 new Int64Array([value])[0]

Number 轉換為 f32

JavaScript Number 使用與 Rust 中轉換 f64f32 相同的規則轉換為 Rust f32,即 value_f64 as f32

這與 Math.fround 或將 JavaScript Number 指定給 JavaScript 中的 Float32Array 的行為相同,即 new Float32Array([value])[0]

Number 轉換為 f64

由於 JavaScript 數字是 64 位元浮點數值,因此將 JavaScript 的 Number 轉換為 Rust 的 f64 並不會進行任何操作。

Rust 使用範例

#![allow(unused)]
fn main() {
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn take_number_by_value(x: u32) {}

#[wasm_bindgen]
pub fn return_number() -> f64 {
    42.0
}

#[wasm_bindgen]
pub fn take_option_number(x: Option<u8>) {}

#[wasm_bindgen]
pub fn return_option_number() -> Option<i16> {
    Some(-300)
}
}

JavaScript 使用範例

import {
  take_number_by_value,
  return_number,
  take_option_number,
  return_option_number,
} from './guide_supported_types_examples';

take_number_by_value(42);

let x = return_number();
console.log(typeof x); // "number"

take_option_number(null);
take_option_number(undefined);
take_option_number(13);

let y = return_option_number();
if (y == null) {
  // ...
} else {
  console.log(typeof y); // "number"
}