在编译我的程序'zagir'之后,release文件夹的大小超过200MiB,这对于我编写的程序来说是荒谬的.所以,我试图检查是否只有'zagir'可执行文件是孤立运行的.
但令人困惑的是,release文件夹还包含libzagir.rlib文件以及.d文件和一堆其他文件夹.
Cargo.toml
[package]
authors = ["Sharad Chand"]
name = "zagir"
version = "0.1.0"
[dependencies]
bcrypt = "0.1.3"
dotenv = "0.10.1"
image = "0.17.0"
log = "0.3.8"
r2d2 = "0.7.3"
r2d2-diesel = "0.16.0"
rand = "0.3.16"
rocket = "0.3.2"
rocket_codegen = "0.3.2"
serde = "1.0.11"
serde_derive = "1.0.11"
serde_json = "1.0.2"
validator = "0.6.0"
validator_derive = "0.6.0"
[dependencies.bigdecimal]
features = ["serde"]
version = "0.0.10"
[dependencies.chrono]
features = ["serde"]
version = "0.4.0"
[dependencies.diesel]
features = [
"mysql", …
Run Code Online (Sandbox Code Playgroud) 我正在使用proc_macro
和设计自定义HTML语法分析器syn
.一个样品:
#[derive(Debug)]
struct BlockElement {
stag: Ident,
child: Vec<Element>,
ctag: Ident
}
impl Synom for BlockElement {
named!(parse -> Self, do_parse!(
punct!(<) >>
stag: syn!(Ident) >>
punct!(>) >>
child: syn!(ElementList) >>
punct!(<) >>
punct!(/) >>
ctag: syn!(Ident) >>
punct!(>) >>
(BlockElement { stag, child: child.inner, ctag })
));
}
Run Code Online (Sandbox Code Playgroud)
虽然我知道Span
在解析之后如何使用错误,我无法在解析过程中弄清楚如何使用错误.它只是出错了failed to parse anything
.如何确定解析失败的位置并给出适当的错误?
我试图将观察者模式应用于Rust.与其他GC语言(如JS或Java)一样,我想Observable
在事件中发送对数据的引用Observer
.但是由于借用检查器,编译器继续让我头疼.因此,我学会了使用,Rc
但它没有让我改变价值,Observable
然后我使用了一个RefCell
内部可变性,这是我想要的.霍拉我说.但后来我意识到Rc
导致从不同地方引用单个位置的原因导致事件系统Observer
过时.所以在删除事件方法之后Observer
,我得到了:
struct Observable<T: Clone> {
value: Rc<RefCell<T>>
}
impl<T: Clone> Observable<T> {
fn new(value: T) -> Observable<T> {
Observable {
value: Rc::new(RefCell::new(value))
}
}
fn set_value(&mut self, value: T) {
*self.value.borrow_mut() = value;
}
fn register(&mut self) -> Observer<T> {
Observer::new(self.value.clone())
}
}
struct Observer<T: Clone> {
value: Rc<RefCell<T>>
}
impl<T: Clone> Observer<T> {
fn new(value: Rc<RefCell<T>>) -> Observer<T> {
Observer {
value
} …
Run Code Online (Sandbox Code Playgroud) 我正在创建很多结构,Option<Vec<T>>
而不是Vec<T>
在不需要时不分配内存.我抬头一看这个答案对两者的大小Vec
及Option<Vec>>
两者都是相同的.
所以我的问题是这个.我应该使用Vec<T>
并检查其.len()
效果是否相同或继续使用Option
?或者他们是等同的?
最初我也是一名JavaScript开发人员.并且偏执过分配或不分配.
我正在尝试创建一个T
使用P::Child
struct P
where 初始化struct的宏P: Parent<Child = T>
.
macro_rules! init {
($t:tt, { $( $k:ident => $v:expr ),* }) => {
<$t as Parent>::Child {
$( $k: $v ),*
}
};
}
Run Code Online (Sandbox Code Playgroud)
这个宏将props作为一个map传递给struct的给定构造函数.扩展,它看起来像这样:
#[derive(Debug)]
struct Apple {
a: i32
}
trait Parent {
type Child;
}
struct Mango;
impl Parent for Mango {
type Child = Apple;
}
fn main() {
let a = <Mango as Parent>::Child {
a: 4
};
println!("{:?}", a);
}
Run Code Online (Sandbox Code Playgroud)
编译它有错误: …
我的后端,在Rocket(Rust)中,没有内置压缩.因此,它依赖于代理来压缩它.虽然nginx入口控制器支持它,但我认为默认的是否也有它,因为它具有高可用性.
如果没有,那么我应该怎么设置?
我想实现proc_macro_attribute
这样一个:
#[component]
struct Div {
#[prop]
color: String,
clicked: bool
}
Run Code Online (Sandbox Code Playgroud)
其中两个属性的 impl 是:
#[proc_macro_attribute]
pub fn component(_attribute: TokenStream, input: TokenStream) -> TokenStream {
modify_struct_and_generate_props_struct(input)
}
// Just as a placeholder attribute for the component attribute to work on.
#[proc_macro_attribute]
pub fn prop(_attribute: TokenStream, input: TokenStream) -> TokenStream {
input
}
Run Code Online (Sandbox Code Playgroud)
我可以使用自定义派生来完成此操作,但这不是我想要在这里实现的目标,因为任何带有注释的结构都#[component]
将被修改以包含其他字段。sub#[prop]
属性用于创建仅由 prop 字段组成的新结构。
不proc_macro_attribute
支持在其上下文中使用的其他子属性,我尝试实现一个单独的属性来缓解这种情况。这会导致编译器出错:
#[component]
struct Div {
#[prop]
color: String,
clicked: bool
}
Run Code Online (Sandbox Code Playgroud)
添加此功能与#![feature(proc_macro)]
.
我已经在GitHub上定义了问题。你可以查一下它,看看我正在努力实现什么目标。
难道就没有其他可能的出路吗?
如果这不是它本来的样子,我还向 …