[英]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!
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))))));
}
我的問題是
那個box!
宏在 Rust 中頻繁使用,卻不流行?
定義宏的正確方法是什么? 有什么注意事項嗎?
這有點主觀,但我相信向量的使用頻率要高得多。 和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.