簡體   English   中英

Box::new 宏,如 vec! 在 Rust

[英]Box::new macro like vec! in Rust

我在 Rust 語言中看到了很多Box::new的用法。

https://doc.rust-lang.org/book/ch15-01-box.html

fn main() {
    let b = Box::new(5);
    println!("b = {}", b);
}

但是,我認為這有點多余,尤其是在這樣的代碼中:

enum List {
    Cons(i32, Box<List>),
    Nil,
}

use crate::List::{Cons, Nil};

fn main() {
    let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
}

現在,我想用我們看到的vec!

https://doc.rust-lang.org/book/ch19-06-macros.html?highlight=vec#declarative-macros-with-macro_rules-for-general-metaprogramming

let v: Vec<u32> = vec![1, 2, 3];

這樣帶box! 宏,我們可以寫:

fn main() {
    let b = box!(5);
    println!("b = {}", b);
}

或者

fn main() {
    let list = Cons(1, box!(Cons(2, box!(Cons(3, box!(Nil))))));
}

我的問題是

  1. 那個box! 宏在 Rust 中頻繁使用,卻不流行?

  2. 定義宏的正確方法是什么? 有什么注意事項嗎?

這有點主觀,但我相信向量的使用頻率要高得多。 vec! box! 你指的宏。

至於宏的實現,你可以這樣寫:

macro_rules! bx {
    ($e:expr) => {
        Box::new($e)
    };
}

這是一個示例用法:

let b = Box::new(3);
let m = bx!(7);

請注意,我將其命名為bx! 而不是box! , 因為后者是 Rust 中的保留字。

感謝@at54321,我用谷歌搜索發現

https://doc.rust-lang.org/beta/unstable-book/language-features/box-syntax.html

#![feature(box_syntax)]

fn main() {
    let b = box 5;
}

所以,已經在那里了。

但是,由於某些未知原因,Rust 家伙更喜歡將宏用於 vec! 或打印!

我建議反過來問:為什么vec! println! 是函數? 答案是,兩者都是可變參數(可以接受可變數量的參數)並且 Rust 中沒有可變參數函數。 println! ,其arguments也可以有不同的類型; 對這些類型的約束取決於第一個參數! 嘗試將println的類型寫為 function,您會發現它的可用性效率要低得多。

問題vec! 解決的更小。 但正如 Chayim Friedman 的評論所說,直到最近你甚至不可能擁有

Vec::from([1,2,3])

如果沒有vec! 宏。 我認為你能做的最好的是

Vec::from(&[1,2,3])

當然, Box::new根本沒有這個問題。 所以它是一個 function 只是因為它不必是一個宏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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