【发布时间】:2017-07-06 12:15:31
【问题描述】:
这个例子编译失败:
extern crate nix;
use std::os::unix::io::RawFd;
fn func(fd: RawFd, buf: &mut [u8]) -> Result<(), nix::Error> {
let (size, nix_addr) = nix::sys::socket::recvfrom(
fd, buf
)?;
let addr = match nix_addr {
//nix::sys::socket::SockAddr::Inet(addr) => addr.to_std(),
Inet(addr) => addr.to_std(),
_ => panic!(),
};
Ok(())
}
fn main() {}
这个版本的错误是:
error[E0531]: unresolved tuple struct/variant `Inet`
--> match_arms.rs:14:3
|
14 | Inet(addr) => addr.to_std(),
| ^^^^
将Inet 行替换为注释掉的行可以成功编译。
编译器似乎要求我自己指定枚举类型,我想它知道我在match arm 中指定的变体是合法的。 但是为什么呢?不能推断出枚举吗? 编译器在这里没有足够的信息来意识到nix_addr 是nix::…::SocketAddr,因此,Inet 是一个有效的变体(并且带有数据) ?
为什么我必须输入整个内容,或者使用use 将名称拖到当前范围内?
我也试过_::Inet,也失败了。
【问题讨论】:
标签: enums rust type-inference