Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Rust变量枚举强制转换为基础结构?_Rust - Fatal编程技术网

如何将Rust变量枚举强制转换为基础结构?

如何将Rust变量枚举强制转换为基础结构?,rust,Rust,下面的bind()调用适用于IPV4,但不适用于IPV6 pub enum SocketAddr { V4(SocketAddrV4), V6(SocketAddrV6), } pub fn new<A: ToSocketAddrs>(local_addr: A, _: Option<u32>) -> io::Result<UdpConnector> { let mut addr = net::addr_from_trait(l

下面的
bind()
调用适用于IPV4,但不适用于IPV6

pub enum SocketAddr {
    V4(SocketAddrV4),
    V6(SocketAddrV6),
}

pub fn new<A: ToSocketAddrs>(local_addr: A, _: Option<u32>) -> io::Result<UdpConnector> {
    let mut addr = net::addr_from_trait(local_addr)?;
    debug!("Attempting to connect to {:?}", addr);
    UdpSocket::bind(addr).expect(&format!("Couldn't bind to address {:?}", addr))
}
如果我尝试进行隐式转换,就会出现类型不匹配错误。我猜它告诉我,
addr
是一个枚举,而不是
SocketAddrV6
结构。我知道。我怎样做铁锈铸造

54 |让addr2:SocketAddrV6=addr;
|--------------^^^应为结构'std::net::SocketAddrV6',找到枚举'std::net::SocketAddr'`
这里是另一个转换尝试。同样的错误

55 |让addr2=SocketAddr::V6(addr);
|^^^应为结构'std::net::SocketAddrV6',找到枚举'std::net::SocketAddr'`
再来一次

错误[E0573]:应为类型,找到变量`SocketAddr::V6`
-->src/net/connector.rs:52:33
|
52 |让addr2=addr作为SocketAddr::V6;
|^^^^^^^^^^^^^^^^^^不是一种类型
编辑:基于@Lukas solution,下面的代码似乎已经编译好了,但我还不知道它是否在做我想要的事情

let mut addr2=if let SocketAddr::V6(c)=addr{c}else{unreachable!()};
addr2.set_scope_id(2);

还是这个?我鼓励你重读,尤其是《圣经》。这些生锈的基本原理被现有的材料很好地覆盖了。@Lukas,我已经看到了你的解决方案,但是你没有真正解释语法,我也无法用头脑去思考它。我今天又试了一次,我想我有了一些似乎有效的方法,尽管我仍然不懂语法。我花了几个小时试图弄明白这一点,用谷歌搜索并尝试各种解决方案。我决没有把我试过的东西都贴出来。把这件事了结是非常令人沮丧的。我很欣赏卢卡斯的回应,尽管我在发布这个问题时已经看到了他的解决方案。“PaulStone不认为这是浪费时间,也许你的下一个问题应该是为什么这个语法会起作用?请检查,我写了一个关于这个的答案:,如果你在阅读后还有问题,请提问,祝你好运。
let addr2 = addr as SocketAddrV6