如何将 Rust 变体枚举转换为底层结构?

Pau*_*one 5 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(local_addr)?;
    debug!("Attempting to connect to {:?}", addr);
    UdpSocket::bind(addr).expect(&format!("Couldn't bind to address {:?}", addr))
}
Run Code Online (Sandbox Code Playgroud)

我认为我需要scope_idSocketAddrV6. 但是,我没有SocketAddrV6,我只有一个SocketAddr没有实现scope_id().

我可以调用is_ipv6()SocketAddr,以查看它是什么类型。如果是IPV6,那么用C语言来说,我想投射到底层SocketAddrV6,所以我可以调用set_scope_id()它。然后我想将结果SocketAddrSocketAddrV6变量传递给bind().

我试过的

以下显然仅适用于原始类型:

let addr2 = addr as SocketAddrV6
Run Code Online (Sandbox Code Playgroud)

如果我尝试进行隐式转换,则会出现类型不匹配错误。我想它告诉我这addr是一个枚举,而不是一个SocketAddrV6结构。我知道。我如何在 Rust 中进行强制转换?

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))
}
Run Code Online (Sandbox Code Playgroud)

这是另一个转换尝试。同样的错误。

let addr2 = addr as SocketAddrV6
Run Code Online (Sandbox Code Playgroud)

另一个尝试

54 |             let addr2: SocketAddrV6 = addr; 
   |                        ------------   ^^^^ expected struct `std::net::SocketAddrV6`, found enum `std::net::SocketAddr`
Run Code Online (Sandbox Code Playgroud)

编辑:基于@Lukas 解决方案,以下似乎可以编译,但我还不知道它是否在做我想要的。

55 |             let addr2 = SocketAddr::V6(addr);
   |                                        ^^^^ expected struct `std::net::SocketAddrV6`, found enum `std::net::SocketAddr`
Run Code Online (Sandbox Code Playgroud)