我有一个看起来非常愉悦的东西,但我担心它的影响:
#[derive(Eq, PartialEq, Debug)]
pub enum SmtpHost {
DOMAIN(String),
IPV4(Ipv4Addr),
IPV6(Ipv6Addr),
UNKNOWN { label:String, literal:String },
}
我正在使用PEG语法填充文本,它给了我&str
,因此所有字符串调用都像这样 - SmtpHost::Domain(s.to_string())
我希望这些枚举类型是解析器的结果,例如smtp_parser::host< 'input >(s: 'input & str) -> SmtpHost
我也尝试了引用方法,但很快就变得笨拙不堪:
#[derive(Eq, PartialEq, Debug)]
pub enum SmtpHost<'a > {
DOMAIN(&'a str),
IPV4(Ipv4Addr),
IPV6(Ipv6Addr),
UNKNOWN { label:&'a str, literal:&'a str },
}
我觉得这个问题可以是两个方案中的一个,但你知道更好,告诉我吧 :o)
这是我的参考研究项目
CamelCase
而不是FULLCAPS
书写。如果你有特殊原因需要这样做,我道歉。但如果没有,最好遵循约定 :) - Kroltan&str
is not owned, so if you want to be able to keep your tokens around after the parser finishes, you probably have to useString
- zstewartsmtp_parser::host<'input>(s: &'input str) -> SmtpHost
一样。 - Robert Cutajar&str
返回SmtpHost
,那么返回的SmtpHost
的生命周期必须是 <='input
,因为签名必须是:smtp_parser::host<'input>(s: &'input str) -> SmtpHost<'input>
。除非您有特定的原因需要这些值借用不同字符串的一部分;在我看来,它们应该拥有匹配的值。因此,请使用String
。 - zstewartString
是否可变取决于它是否存储在可变变量中。如果您使用let host = smtp_parser::host(s);
,那么String
也将是不可变的。从技术上讲,可以构造使用隐私来始终强制不可变性的类型,但这通常是不必要的,因为通常可以在使用站点而不是声明处控制可变性。 - zstewart