Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Algol68
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C with Coccinelle
C++ with Coccinelle
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Mojo
Nim
Numba
Nix
Objective-C
Objective-C++
OCaml
Odin
OpenCL C
Pascal
Pony
PTX
Python
Racket
Raku
Ruby
Rust
Sail
Snowball
Scala
Slang
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
Triton
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Yul (Solidity IR)
Zig
Javascript
GIMPLE
Ygen
sway
rust source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
mrustc (master)
rustc 1.0.0
rustc 1.1.0
rustc 1.10.0
rustc 1.11.0
rustc 1.12.0
rustc 1.13.0
rustc 1.14.0
rustc 1.15.1
rustc 1.16.0
rustc 1.17.0
rustc 1.18.0
rustc 1.19.0
rustc 1.2.0
rustc 1.20.0
rustc 1.21.0
rustc 1.22.0
rustc 1.23.0
rustc 1.24.0
rustc 1.25.0
rustc 1.26.0
rustc 1.27.0
rustc 1.27.1
rustc 1.28.0
rustc 1.29.0
rustc 1.3.0
rustc 1.30.0
rustc 1.31.0
rustc 1.32.0
rustc 1.33.0
rustc 1.34.0
rustc 1.35.0
rustc 1.36.0
rustc 1.37.0
rustc 1.38.0
rustc 1.39.0
rustc 1.4.0
rustc 1.40.0
rustc 1.41.0
rustc 1.42.0
rustc 1.43.0
rustc 1.44.0
rustc 1.45.0
rustc 1.45.2
rustc 1.46.0
rustc 1.47.0
rustc 1.48.0
rustc 1.49.0
rustc 1.5.0
rustc 1.50.0
rustc 1.51.0
rustc 1.52.0
rustc 1.53.0
rustc 1.54.0
rustc 1.55.0
rustc 1.56.0
rustc 1.57.0
rustc 1.58.0
rustc 1.59.0
rustc 1.6.0
rustc 1.60.0
rustc 1.61.0
rustc 1.62.0
rustc 1.63.0
rustc 1.64.0
rustc 1.65.0
rustc 1.66.0
rustc 1.67.0
rustc 1.68.0
rustc 1.69.0
rustc 1.7.0
rustc 1.70.0
rustc 1.71.0
rustc 1.72.0
rustc 1.73.0
rustc 1.74.0
rustc 1.75.0
rustc 1.76.0
rustc 1.77.0
rustc 1.78.0
rustc 1.79.0
rustc 1.8.0
rustc 1.80.0
rustc 1.81.0
rustc 1.82.0
rustc 1.83.0
rustc 1.84.0
rustc 1.85.0
rustc 1.86.0
rustc 1.87.0
rustc 1.88.0
rustc 1.89.0
rustc 1.9.0
rustc 1.90.0
rustc beta
rustc nightly
rustc-cg-gcc (master)
x86-64 GCCRS (GCC master)
x86-64 GCCRS (GCCRS master)
x86-64 GCCRS 14.1 (GCC assertions)
x86-64 GCCRS 14.1 (GCC)
x86-64 GCCRS 14.2 (GCC assertions)
x86-64 GCCRS 14.2 (GCC)
x86-64 GCCRS 14.3 (GCC assertions)
x86-64 GCCRS 14.3 (GCC)
x86-64 GCCRS 15.1 (GCC assertions)
x86-64 GCCRS 15.1 (GCC)
x86-64 GCCRS 15.2 (GCC assertions)
x86-64 GCCRS 15.2 (GCC)
Options
Source code
use std::io::{Read, Result}; use std::net::{TcpListener, TcpStream}; /// 模拟 TLS 流(在真实项目中通常来自 `native_tls`、`rustls` 等库) /// /// - Rust 中可以很容易地为泛型类型手动实现功能;这里我们只需要一个包装器来表现“TLS 层”。 /// - `FakeTlsStream<T>` 持有一个底层流 `T`,用于展示“枚举成员关联不同类型”的能力。 #[derive(Debug)] struct FakeTlsStream<T>(T); /// 为 FakeTlsStream 实现 `Read` trait,使其行为与底层流一致。 /// /// Rust 重度依赖 trait 来抽象接口;类似 C++ 的纯虚基类。 /// 这里 `impl<T: Read> Read for FakeTlsStream<T>` 表示: /** * - 对于任何实现了 `Read` 的类型 `T`,`FakeTlsStream<T>` 也实现 `Read`。 * - 因此枚举在匹配其变体时,可以统一调用 `read`。 */ impl<T: Read> Read for FakeTlsStream<T> { fn read(&mut self, buf: &mut [u8]) -> Result<usize> { // 直接把调用委托给被包装的底层流。 // 真实的 TLS 实现会在这里进行解密等操作。 self.0.read(buf) } } /// 枚举封装不同底层连接:TCP 和 TLS。 /// /// 与 C++ 中使用 `std::variant` 的思路相同,但 Rust 的枚举(`enum`)原生支持模式匹配, /** * 并且每个变体可以携带不同类型的数据。 * * 这里:`Websocket::Tcp` 持有 `TcpStream`,`Websocket::Tls` 持有 `FakeTlsStream<TcpStream>`。 */ #[derive(Debug)] enum Websocket { Tcp(TcpStream), Tls(FakeTlsStream<TcpStream>), } impl Websocket { /// 示例方法:统一读取一行数据。 /// /// - `&mut self`:在 Rust 中,方法的第一个参数类似 `self`,但你要显式声明借用方式(可变 / 不可变)。 /// - 通过 `match` 对枚举进行模式匹配,分别处理 TCP/TLS 两种情况,但整体逻辑统一。 fn read_line(&mut self) -> Result<String> { let mut buf = [0_u8; 64]; // 定长缓冲区,演示用途 let n = match self { // `match` 类似 C++17 的 `std::visit`,但更强大且语法简洁。 Websocket::Tcp(stream) => stream.read(&mut buf)?, Websocket::Tls(stream) => stream.read(&mut buf)?, }; Ok(String::from_utf8_lossy(&buf[..n]).to_string()) } } /// 接受原始连接并根据条件包装成统一的枚举类型。 /// /// - 参数 `stream` 的所有权被移动进函数,这是 Rust 的所有权模型:函数结束前它一直归我们所有。 /// - 返回的 `Websocket` 枚举同样拥有底层流的所有权(无需手动 `new` / `delete`)。 fn accept_connection(stream: TcpStream, use_tls: bool) -> Websocket { if use_tls { let tls_stream = FakeTlsStream(stream); Websocket::Tls(tls_stream) } else { Websocket::Tcp(stream) } } /// 使用统一逻辑处理任意类型的 WebSocket 连接。 /// /// - 函数参数 `ws` 接受一个枚举值,调用端无需关注它具体是哪种流。 /// - Rust 会在编译期验证所有匹配情况是否覆盖全面,避免遗漏。 fn handle_websocket(mut ws: Websocket) -> Result<()> { println!("Incoming connection: {ws:?}"); let line = ws.read_line()?; println!("Received: {line}"); Ok(()) } /// 程序入口:监听本地 TCP 端口并模拟处理 TCP/TLS 两种连接。 /// /// - `?` 运算符:若 `Result` 是 `Err`,直接向上传播错误,类似 C++ 中手动检查并返回。 /// - `listener.incoming()` 返回迭代器,每个元素都是一个 `Result<TcpStream>`。 fn main() -> Result<()> { // 绑定监听地址;如果失败(例如端口被占用),错误会通过 `?` 返回。 let listener = TcpListener::bind("127.0.0.1:4000")?; println!("Listening on 127.0.0.1:4000"); // 枚举所有进入的连接;`enumerate` 为每个连接附带一个递增编号。 for (idx, stream) in listener.incoming().enumerate() { let stream = stream?; // 处理 `Result`,失败时早返回。 let use_tls = idx % 2 == 0; // 简单地模拟:偶数序号的连接走 “TLS” 分支。 let ws = accept_connection(stream, use_tls); handle_websocket(ws)?; } Ok(()) }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Compiler Explorer Shop
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
Statistics
Changelog
Version tree