我正在尝试学习Rust,但是当我为我的某个类型实现fmt::Display
特征时,我遇到了困难。我想做这样的事情:
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "(");
some_helper_function(self.t1, self.ctx, f);
write!(f, " ");
some_helper_function(self.t2, self.ctx, f);
write!(f, ")")
}
所有这些函数都返回fmt::Result
,但这将被忽略。向上传播错误结果的正确方法是什么?
答案 0 :(得分:3)
对于每个函数调用,检查返回是否为Err
对象。如果它是从函数返回的Err
对象,如果不是,则继续。
标准库中有一个方便的宏,称为try!,它就是这样做的。
所以你的代码会变成这样:
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
try!(write!(f, "("));
try!(some_helper_function(self.t1, self.ctx, f));
try!(write!(f, " "));
try!(some_helper_function(self.t2, self.ctx, f));
try!(write!(f, ")"))
}
答案 1 :(得分:0)
Andrea P's answer是如何解决这个问题的。我想在这部分添加:
所有这些函数都返回
use strict; use warnings; use v5.10; die "No file names given\n" unless @ARGV; for my $file (reverse(@ARGV)) { next unless -f $file; open(my $fh, '<', $file) or die "Can't open file [$file]: $!\n"; while (<$fh>) { chomp; say; } close($fh); }
,但这将被忽略。
请注意,编译器在此尝试很难帮助您:
fmt::Result
默认情况下会产生此警告:
fn important() -> Result<u8, ()> {
Err(())
}
fn main() {
important();
}
您甚至可以通过将其添加到您的包装箱中来使所有警告变为错误:
warning: unused result which must be used, #[warn(unused_must_use)] on by default
important();
^~~~~~~~~~~~