3.4 练习:泛型日志器

练习:泛型日志器 — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/methods-and-traits/exercise.html

3.4 练习:泛型日志器

让我们设计一个简单的日志工具:用带 log 方法的 Logger trait。可能需要记录进度的代码可以接收 &impl Logger。测试时可能把消息写到测试日志文件,生产构建则可能发送到日志服务器。

不过,下面给出的 StderrLogger 会记录所有消息,不论详细级别。你的任务是编写一个 VerbosityFilter 类型,忽略超过最大详细级别的消息。

这是一种常见模式:结构体包装某个 trait 的实现,并实现同一 trait,同时增加行为。在「泛型」小节中,我们会看到如何让包装器对所包装的类型泛型化。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
trait Logger {
    /// 在给定详细级别记录一条消息。
    fn log(&self, verbosity: u8, message: &str);
}

struct StderrLogger;

impl Logger for StderrLogger {
    fn log(&self, verbosity: u8, message: &str) {
        eprintln!("verbosity={verbosity}: {message}");
    }
}

/// 只记录不超过给定详细级别的消息。
struct VerbosityFilter {
    max_verbosity: u8,
    inner: StderrLogger,
}

// TODO: 为 `VerbosityFilter` 实现 `Logger` trait。

fn main() {
    let logger = VerbosityFilter { max_verbosity: 3, inner: StderrLogger };
    logger.log(5, "FYI");
    logger.log(2, "Uhoh");
}

3.4.1 解答

01-解答 — Comprehensive Rust

最后修改 August 11, 2026: 更新 (70a5af133)