跳到正文
Hacker News· grajo·· 6 天前AI 评分38

rustcoach:用 rustc 逐题批改的 Rust 免费测验

Show HN: How good is your Rust? Free quiz, every code answer checked by rustc

AI 导读

rustcoach 上线免费 Rust 测验,每道代码答案都由 rustc 实际编译运行并跑 clippy 检查。它基于 Claude 构建,会记录你此前答错的内容并在新课前重测,复习卡片按 1、3、7、14、30、60 天间隔回归,完整课程一次性收费 $49。

正文 · AI 翻译

译文尚不完整,完整内容请切换到原文。

rustcoach 测试你的 Rust 为什么不用聊天机器人 模块 工作原理 价格 常见问题 登录 开始学习

你的 AI 聊天讲解 Rust。rustcoach 让你亲手写出来。

一位会记住你哪里出错的教练,用真实测试运行你的代码,像审查 pull request 一样审查它,而且不会直接把答案交给你。专为从 Python、JavaScript 或 Java 转来的开发者打造;也欢迎完全零基础的新手。一次性 $49。

为什么不直接问 AI 聊天机器人?

你可以问,它也能把 Rust 讲得很好。rustcoach 同样基于 Claude 构建。聊天窗口做不到的,是讲解之外的一切。

AI 聊天rustcoach

不会追踪你三节课前哪里出了错。会记录你的情况,在教新内容之前重新测试你上次出错的地方。

会读你的代码。但没有任何东西用测试套件来约束它。会在沙箱中编译它、运行测试并运行 clippy。

你一开口要,它就把修复写出来。会为你指出该用的 API,并逐行追踪你的代码。修复仍然由你完成。

等你先知道该问什么。每个模块的章节按顺序排列,没掌握就不算通过。

不会在你快要忘记时把某个主题重新带回来。会在 1、3、7、14、30 和 60 天后重新带回复习卡片。

真实的一节课,不是演示样机

录制自真实课程:测试通过了,但审查仍然发现了一个多余的 return 和一条被跳过的指令。每个画面都是应用实际运行的样子。

仅在你点击时才从 YouTube(youtube-nocookie.com)播放。更多:五个步骤 · 那些小工具。

从读懂 Rust 到写出 Rust。五个步骤,全程都有教练在你身边。

01

为你量身写的一节课,不是模板

没有那种人人都上的第 7 课。教练会读取关于你的笔记,重新测试你上次出错的地方,然后用你能运行的示例教一个概念,每隔几段讲解就检查一下你是否真的掌握了。

教练

第一个字的字节长度,如果没有则为 None。你上次用了索引;试试组合子。

rust

fn first_word_len(text: &str) -> Option<usize> {
    text.split_whitespace().next().map(str::len)
}

run_tests

  • first_word
  • empty_string
  • leading_spaces

审查:没有 unwrap,一条组合子链。通过。3 个通过

02

一迷路就提问

在课程中途打断:“等等,为什么是 &str 而不是 String?”教练会结合屏幕上的代码来回答,然后从你停下的地方继续。没有问题是太小的,你学过的任何主题都只需点击一下。

教练

所以 first_word 接收一个字符串并返回它的一个切片,不复制任何一个字节……

等等,为什么是 &str 而不是 String?我以为字符串是 String。

教练

String 拥有它的字节;&str 只是借用它们。采用 &str 意味着这个函数既能接受 String(作为 &s),也能接受像 "hi" 这样的字面量,而且永远不会把你的字符串拿走。

回到我们刚才的地方:我们返回的切片指向调用者的字符串,所以……

03

每一行都由你写

每节课都以一个你自己在浏览器编辑器中编写的作业结束,由测试来决定何时完成。卡住了?提示会指出该用哪个 API,追踪功能会逐行走过你的函数。但绝不给出答案。

src/lib.rs·17 行 追踪开启提示开启

7pub fn initials(name: &str) -> Option<String> { 8 let mut words = name.split_whitespace(); 9 let first = words.next()?; first ="ada"words =SplitWhitespace { … }name ="ada lovelace" 10 let last = words.last()?; 11 let a = first.chars().next()?; 12 let b = last.chars().next()?;

initials测试 initials_ok · 第 3 步,共 10 步下一步

04

像审查拉取请求一样审查

测试通过只是审查的起点。教练会阅读你实际写出的代码,并按照专业 Rust 的写法来要求它:没有多余的 unwrap,用组合子代替嵌套的 match,clippy 无警告,应用 cargo fmt。你不断修改,直到它被签字通过。

审查 · parse_pair

三个测试全部通过。在我签字通过之前还有两件事:

  1. 第 11 行对第一个字符使用 .unwrap() 在空单词上会 panic。该函数已经返回 Option:请使用 ?。
  2. 第 9–14 行对 Option 的两层嵌套 match 读起来像一步:first.zip(last)。
  3. clippy第 15 行的 needless_return。最后一个表达式就是返回值。

修改,运行测试,重新提交。请求更改

05

没真正掌握就不算完成

掌握程度随答对而上升,随答错而下降。不扎实的主题会以重做的形式回来,复习卡片会在 1、3、7、14、30 和 60 天后再次出现。教练会记录哪些内容已经掌握,下一课就从那里开始。

所有权与移动语义

讲解了单一所有者模型以及赋值时的移动。三道检查题全部答对;在 Copy 与 Drop 上需要一次纠正。

Copy 与 Clone

现在能在自己的类型上派生 Copy。clone_from 尚未教授。

引用与借用规则

首次尝试就通过了全部 9 个测试。重新测试他在长度不变时是否会选择 &mut [T]。

切片(&str、&[T])

围绕人们实际会卡住的地方构建。

小工具,每一个都对应你原本会孤立无援的那一刻。

快速检查

哪一行移动了 s 而不是借用它?

Alet t = &s; Blet t = s; Clet n = s.len();

正确。

把 String 赋值给新绑定会移动它;&s 和方法调用只是借用。

快速检查

每隔几次讲解,教练会问一个问题。点击,看看原因,课程会根据你的回答继续。

构建失败 与教练一起解释

  • E0382borrow of moved value: wordsline 9

    是什么第 8 行把 words 按值交给了 next(),所以到第 9 行时已经没有东西可供借用了。

    试试看看迭代器的 next 接受什么:&mut self。该绑定需要允许这一点。

编译器错误教练

构建失败时会列出每条 rustc 错误并高亮对应行。一键即可用通俗英语解释出错原因以及下一步该尝试什么。修复仍由你来做。

src/lib.rs·21 行3 条 clippy 提示

14 let unused = 1; 15 if out.len() == 0 { return None; } 16 return Some(out); 17}

clippy · len_zero

与零比较长度

  • 使用 is_empty 更清晰、更明确

关于 len_zero

Clippy 作为额外的老师

每次运行测试时也会运行 clippy。每条 lint 都是排水沟里的一把扫帚,附带消息、帮助和链接,而复习会讲解其中一条背后的惯用法。

复习8 之 3·第 2 章 · Copy 与 Clone

这会打印什么?

let a = String::from("hi");
let b = a.clone();
println!("{a} {b}");

A编译错误:a 已被移动 Bhi hi Chi 然后 panic

正确。

clone 会创建第二个 String,所以两个绑定仍然可用。

7 天后回来。下一个

复习卡片

当一节课结束时,教练会为它验收的每个主题写两张卡片。它们会在 1、3、7、14、30 和 60 天后回来。答错则明天带回一张。

拓展挑战

已接受。现在让 initials 在不进行两次 to_ascii_uppercase 分配的情况下工作:一个 String,只构建一次。

拓展可选。跳过

拓展挑战

解答被接受?一个可选的重构。额外加分,从不属于验收的一部分。

src/lib.rsscratch.rs

1fn main() {2 let v = vec![3, 1, 2];3 println!("{:?}", v.iter().max());4}

运行已运行

Some(3)

一个草稿文件

作业旁边的 scratch.rs。在同一个沙盒中 cargo run,不计分,访问之间会保存。

3let first = words.next()?;4let last = words.last()?;

解释⌘⇧E

教练

在 Option 上使用 ? 会从整个函数返回 None,所以这两行同时也是“少于两个单词”的守卫。

解释此选择

选中代码,按一个快捷键,教练就会在课程中解释它。

7连续天数

第 2 章

所有权与借用

掌握度 85%

第 2 章完成。

连续天数与掌握度

当你聊天、运行测试或回答卡片时,这一天就算数。掌握度随验收和正确答案上升,随错误答案下降。

五个模块。从任意一个开始。

核心 Rust 带你学习整个语言。四个深度专题各自深入一个主题,并且每个都从所需的基础开始,所以你可以从你关心的那个开始。每个模块的进度、课程和复习卡片都单独保存。

    1. Rust 开始显得与众不同的地方:几乎一切都是表达式,编译器会要求你遵守这一点。绑定、可变性与遮蔽、基本类型,以及所有控制流形式(包括 match),都在所有权登场之前。

      1. 01变量、可变性与遮蔽
      2. 02基本类型与字面量
      3. 03函数,以及表达式与语句的区别
      4. 04控制流:if、loop、while、for、match 基础
    2. 这一章让 Rust 成为 Rust。移动、Copy 与 Clone 的区别、编译器强制执行的借用规则,以及切片。教练会反复测试这些内容,直到借用检查器不再像对手。

      1. 01所有权与移动语义
      2. 02Copy 与 Clone
      3. 03引用与借用规则
      4. 04切片(&str、&[T])
    3. Rust 希望你如何建模数据:带方法的结构体、让非法状态无法表示的枚举,以及编译器会检查穷尽性的模式匹配。Option 和 Result 在这里作为普通枚举出现,而不是魔法。

      1. 01结构体与方法
      2. 02枚举与穷尽性模式匹配
      3. 03Option 与 Result 基础
      4. 04模式语法:解构、守卫、绑定
    4. 三个主力集合:Vec、String 和 HashMap,以及它们各自带来的所有权问题。深入探讨 String 与 &str 的区别,以及 map 的 entry API。

      1. 01Vec 与可增长存储
      2. 02深入理解 String 与 &str
      3. 03HashMap 与 entry API
    5. 何时 panic,何时返回错误。你用 ? 运算符传播失败,设计自定义错误类型,并使用 From 让转换自动发生。零 unwrap,以及 review 检查。

      1. 01panic! 与可恢复错误
      2. 02? 运算符与错误传播
      3. 03自定义错误类型与 From
    6. 泛型而不为抽象而抽象:trait 约束、where 子句、impl Trait,以及单态化对编译器实际生成代码意味着什么。最后以通过 std::ops 实现运算符重载收尾。

      1. 01泛型与单态化
      2. 02Trait、trait 约束、where 子句
      3. 03impl Trait 与默认方法
      4. 04通过 std::ops 实现运算符重载
    7. 生命周期是 Rust 最令人畏惧的特性,但大多只是记法问题。你会了解这些标注实际声明了什么、省略规则何时替你写出它们,以及结构体持有引用需要什么条件。

      1. 01生命周期标注与省略
      2. 02持有引用的结构体
      3. 03'static 与生命周期约束
    8. 闭包,以及 Fn、FnMut 和 FnOnce 背后的三种捕获模式,然后是 Iterator trait 及其适配器。为什么迭代器是惰性的、collect 到底做了什么,以及何时 for 循环仍然是正确选择。

      1. 01闭包与捕获模式
      2. 02Fn / FnMut / FnOnce
      3. 03Iterator trait 与适配器
      4. 04惰性与 collect
    9. 当单纯的独占所有权不够用时该用什么:用于共享所有权的 Box、Rc 和 Arc,用于内部可变性的 RefCell 和 Cell,再加上 Deref、Drop 和 Weak,以及每一个为了灵活性所付出的运行时开销。

      1. 01Box、Rc、Arc
      2. 02RefCell、Cell 与内部可变性
      3. 03Deref、Drop、Weak
    10. Rust 代码在大型项目中如何组织:模块与可见性、use 路径和 crate,包括工作区和特性标志。这些部分只有在项目成长起来之后才开始变得重要。

      1. 01模块、可见性与 use
      2. 02Crate、工作区与特性
    11. Rust 的三种测试:单元测试、集成测试和文档测试,以及各自应该放在哪里。一个简短的章节。习惯比 API 更重要。

      1. 01单元测试、集成测试与文档测试
    12. 由类型系统支撑的无畏并发:创建线程,用 Mutex、RwLock 和原子类型共享状态,通过通道传递消息,以及 Send 和 Sync 究竟承诺了什么。

      1. 01线程与 JoinHandle
      2. 02Mutex、RwLock、原子类型
      3. 03通道(mpsc)
      4. 04Send 与 Sync
    13. 深入完整的 trait 系统:trait 对象与动态分发对比泛型、关联类型、高阶 trait 约束,以及把不变量推进类型里的 newtype 和 typestate 模式。

      1. 01Trait 对象与动态分发
      2. 02关联类型与泛型 trait
      3. 03高阶 trait 约束
      4. 04Newtype 与 typestate 模式
    14. macro_rules! 能做什么,如何毫无畏惧地读懂匹配器语法,以及一次过程宏之旅。足以理解 derive 在替你做什么。

      1. 01声明式宏(macro_rules!)
      2. 02过程宏概览
    15. 逃生通道及其规则:裸指针、unsafe 块承诺遵守的不变量,以及通过 FFI 调用 C。小而谨慎,并诚实地面对编译器再也无法检查的东西。

      1. 01unsafe:裸指针与不变量
      2. 02FFI 与 extern "C"
    16. 从底层理解异步:Future 是什么,async/await 脱糖成什么,Pin 为什么存在,以及 Tokio 如何调度任务。Spawn、select 以及真实服务使用的模式。

      1. 01async/await 与 Future
      2. 02Pin 及其存在的原因
      3. 03Tokio:任务、spawn、select
    1. 异步所依赖的 Rust:所有权、trait 与泛型、闭包、智能指针,以及 Send 和 Sync 承诺了什么。如果你已经会了就快速过,如果不会就讲透。

      1. 01所有权与移动语义
      2. 02引用与借用规则
      3. 03Option 与 Result 基础
      4. 04? 运算符与错误传播
      5. 05泛型与单态化
      6. 06Trait、trait 约束、where 子句
      7. 07impl Trait 与默认方法
      8. 08'static 与生命周期约束
      9. 09闭包与捕获模式
      10. 10Fn / FnMut / FnOnce
      11. 11Box、Rc、Arc
      12. 12Mutex、RwLock、原子类型
      13. 13Send 与 Sync
      14. 14Trait 对象与动态分发
    2. 什么是 Future,poll 和 waker 如何驱动它,以及 async fn 编译成什么。你手写一个 future 和一个运行它的迷你执行器。

      1. 01Future trait 与 Poll
      2. 02Waker 与 Context
      3. 03手写一个 future
      4. 04async fn 作为状态机
      5. 05构建一个最小执行器
    3. 为什么自引用 future 需要 Pin,Unpin 选择退出什么,以及在你编写自己的 future 时如何安全地投影 pin。

      1. 01Pin、Unpin 与自引用 future
      2. 02Pin 投影
      3. 03Box::pin 与 dyn Future
    4. 运行时类型、生成任务及其施加的 'static + Send 约束、阻塞工作,以及在 LocalSet 上运行 !Send future。

      1. 01current_thread 与 multi_thread 运行时
      2. 02spawn、JoinHandle 与 'static + Send 约束
      3. 03spawn_blocking 与阻塞运行时
      4. 04LocalSet 与 !Send future
    5. join!、select! 与 JoinSet:并发运行工作、竞速它们,以及当某个分支落败时取消安全性意味着什么。

      1. 01join! 与 try_join!
      2. 02select! 与取消安全性
      3. 03JoinSet 与结构化并发
      4. 04超时与暂停时间
    6. 何时适合用异步 Mutex,何时适合用 std 的,每个 Tokio channel 及其用途,以及用信号量实现背压。

      1. 01tokio Mutex 与 std Mutex 跨 .await 的对比
      2. 02mpsc 与 oneshot channel
      3. 03broadcast 与 watch channel
      4. 04Semaphore、Notify 与背压
    7. Future 通过被丢弃来取消。取消令牌、仍会运行的清理,以及优雅地关闭服务。

      1. 01基于 Drop 的取消与 CancellationToken
      2. 02优雅关闭
    8. 流及其组合器、AsyncRead 与 AsyncWrite、用编解码器为协议分帧,全部在内存管道上测试。

      1. 01Stream 与 StreamExt
      2. 02AsyncRead、AsyncWrite 与缓冲
      3. 03用 tokio-util 编解码器分帧
      4. 04内存双工流
    9. trait 中的 async fn、dyn 在哪里失效及原因,以及异步闭包。

      1. 01trait 中的 async fn 与 dyn 兼容性
      2. 02异步闭包与 AsyncFn
    10. Actor、有界并行、带退避的重试与限流:生产异步代码不断寻求的模式。

      1. 01Actor 模式
      2. 02用 buffer_unordered 实现有界并行
      3. 03带退避的重试
      4. 04限流
    11. 用暂停时间进行确定性测试、跨任务追踪请求的 tracing span,以及经典的异步 bug。

      1. 01带确定性时间的 #[tokio::test]
      2. 02异步代码中的 tracing
      3. 03异步陷阱:跨 await 的锁与 Send 错误
    12. 一个内存键值服务器:协议、分帧、并发连接与优雅关闭,分多节课构建并测试。

      1. 01键值服务器:协议与分帧
      2. 02键值服务器:连接、关闭与测试
    1. Rust 宏会生成并解析:枚举与模式、trait 与泛型、错误类型、迭代器、模块与 crate。熟悉它则快,不熟悉则详尽。

      1. 01函数与表达式 vs 语句
      2. 02枚举与穷尽式模式匹配
      3. 03模式语法:解构、守卫、绑定
      4. 04Option 与 Result 基础
      5. 05自定义错误类型与 From
      6. 06泛型与单态化
      7. 07Trait、trait 约束、where 子句
      8. 08关联类型与泛型 trait
      9. 09Iterator trait 与适配器
      10. 10模块、可见性与 use
      11. 11Crate、工作区与特性
      12. 12单元测试、集成测试与文档测试
    2. 编译器如何将宏的输入作为 token tree 交给它、片段说明符、重复、分支顺序,以及卫生性保护什么、不保护什么。

      1. 01Token tree 与宏解析
      2. 02片段说明符
      3. 03重复与分隔符
      4. 04多个分支与匹配顺序
      5. 05卫生性及其局限
    3. 宏在何处可见、从库中导出它、$crate,以及阅读宏产生的错误。

      1. 01文本作用域 vs 路径作用域与 #[macro_export]
      2. 02$crate 与库中的宏
      3. 03调试宏与 compile_error!
    4. 内部规则、TT muncher、下推累积与计数:严肃的 macro_rules! DSL 背后的技术。

      1. 01内部规则
      2. 02TT muncher
      3. 03下推累积
      4. 04计数与回调
      5. 05用 macro_rules! 构建 DSL
    5. TokenStream 与 proc_macro2、带有可测试核心的 proc-macro crate、用 syn 解析并用 quote 生成代码。

      1. 01proc_macro vs proc_macro2
      2. 02带有可测试核心的 proc-macro crate 设置
      3. 03用 syn 解析:DeriveInput、Data、Fields
      4. 04用 quote! 生成代码
    6. 编写能处理泛型、辅助属性、枚举与结构体的 derive,并将其错误指向正确的 span。

      1. 01第一个 derive 宏
      2. 02泛型与 split_for_impl
      3. 03辅助属性
      4. 04为枚举 vs 结构体实现 derive
      5. 05带 span 的错误
    7. 包装函数、重写 impl 与模块,以及解析属性参数。

      1. 01包装函数的属性宏
      2. 02作用于 impl 与模块的属性宏
      3. 03解析属性参数
    8. 用 syn 的 Parse trait 实现自定义语法:标点列表、前瞻、自定义关键字,以及一个小型 DSL。

      1. 01用 Parse trait 实现自定义语法
      2. 02Punctuated、前瞻与自定义关键字
      3. 03一个函数式 DSL
    9. Span 与卫生性、用于重写代码的 syn visitor、生成用户能接受的代码,以及宏在编译期的开销。

      1. 01Span 与卫生性:call_site 与 mixed_site
      2. 02syn Visit 与 VisitMut
      3. 03生成代码的人机工程学
      4. 04宏的编译期开销
    10. 将展开结果作为数据进行测试、快照测试,以及针对宏所承诺错误的编译失败测试。

      1. 01使用 proc_macro2 对展开结果进行单元测试
      2. 02展开结果的快照测试
      3. 03编译失败测试
    11. 阅读一个真实 derive 的设计,然后在多节课中构建一个 derive Builder 和一个插桩属性宏。

      1. 01阅读 serde_derive 风格的设计
      2. 02综合项目:derive Builder
      3. 03综合项目:一个插桩属性宏
    1. Rust 并发建立在:所有权与借用、闭包、智能指针与内部可变性、线程,以及 Send 和 Sync 之上。熟悉则快,不熟则细。

      1. 01所有权与移动语义
      2. 02引用与借用规则
      3. 03闭包与捕获模式
      4. 04Fn / FnMut / FnOnce
      5. 05Box、Rc、Arc
      6. 06RefCell、Cell 与内部可变性
      7. 07Trait、trait 约束、where 子句
      8. 08泛型与单态化
      9. 09生命周期标注与省略
      10. 10线程与 JoinHandle
      11. 11Send 与 Sync
      12. 12Iterator trait 与适配器
    2. 可借用的作用域线程、线程构建器与 panic、线程局部存储,以及 parking。

      1. 01作用域线程
      2. 02线程构建器与跨线程 panic
      3. 03线程局部存储
      4. 04Parking 与 unpark
    3. Mutex 与中毒、RwLock 与饥饿、条件变量、一次性初始化,以及通过设计避免死锁。

      1. 01Mutex 与中毒
      2. 02RwLock 与写者饥饿
      3. 03Condvar
      4. 04Barrier、OnceLock 与 LazyLock
      5. 05死锁与锁顺序
    4. 有界通道与背压、crossbeam 的通道与 select,以及扇出再扇入的流水线。

      1. 01sync_channel 与背压
      2. 02crossbeam 通道与 select
      3. 03带扇出与扇入的流水线
    5. 原子类型、比较并交换循环、fetch_update,以及在竞争下仍保持正确的计数器。

      1. 01原子类型与操作
      2. 02compare_exchange 与 CAS 循环
      3. 03fetch_update
      4. 04原子计数器与统计
    6. Happens-before、Relaxed、Release 与 Acquire、SeqCst 与栅栏:每种顺序保证什么、代价是什么。

      1. 01Happens-before
      2. 02Relaxed 顺序
      3. 03Release 与 Acquire
      4. 04SeqCst
      5. 05栅栏
    7. 自旋锁、一次性通道、Arc、Mutex、Condvar 与 RwLock,从原子操作开始逐层实现。

      1. 01自旋锁
      2. 02一次性通道
      3. 03从零实现 Arc
      4. 04基于 futex 风格等待的 Mutex 与 Condvar
      5. 05从零实现 RwLock
    8. Treiber 栈、ABA 问题、安全内存回收,以及单生产者环形缓冲区。

      1. 01Treiber 栈
      2. 02ABA 问题
      3. 03内存回收:epoch 与 hazard pointer
      4. 04SPSC 环形缓冲区
    9. 用 loom 对并发代码进行穷尽式模型检查,以及压力测试能证明什么、不能证明什么。

      1. 01用 loom 进行模型检查
      2. 02并发代码的压力测试
    10. rayon 的并行迭代器、join 与 scope,以及工作窃取如何让每个核心都保持忙碌。

      1. 01rayon par_iter
      2. 02rayon join 与 scope
      3. 03工作窃取
    11. 伪共享、分片以减少争用,以及为任务选择合适的原语。

      1. 01伪共享与缓存填充
      2. 02分片以减少争用
      3. 03选择合适的原语
    12. 一个带淘汰的并发缓存和一个能优雅关闭的线程池,在若干课中逐步构建并验证。

      1. 01带淘汰的并发缓存
      2. 02能优雅关闭的线程池
    1. 本模块所依托的 Rust 基础:结构体与枚举、泛型与 trait、生命周期、闭包、迭代器与智能指针。熟悉则快,不熟则详。

      1. 01结构体与方法
      2. 02枚举与穷尽式模式匹配
      3. 03泛型与单态化
      4. 04trait、trait 约束、where 子句
      5. 05impl Trait 与默认方法
      6. 06生命周期标注与省略
      7. 07持有引用的结构体
      8. 08'static 与生命周期约束
      9. 09闭包与捕获模式
      10. 10Iterator trait 与适配器
      11. 11Box、Rc、Arc
      12. 12Deref、Drop、Weak
    2. 一致性(coherence)与孤儿规则、blanket impl、方法调用如何解析、supertrait 与向上转型,以及 auto trait。

      1. 01一致性与孤儿规则
      2. 02Blanket impl
      3. 03方法解析:自动引用与自动解引用
      4. 04Supertrait 与 trait 向上转型
      5. 05Auto trait:Send、Sync、Unpin、Sized
    3. 哪些 trait 可以是 dyn 以及为什么、vtable 与胖指针、动态大小类型,以及用 Any 进行向下转型。

      1. 01dyn 兼容性规则
      2. 02vtable 与胖指针
      3. 03DST 与 ?Sized
      4. 04Any 与向下转型
    4. 关联类型与泛型参数、关联常量、泛型关联类型,以及 trait 中的 impl Trait。

      1. 01关联类型与泛型参数
      2. 02关联常量
      3. 03泛型关联类型
      4. 04trait 中的 impl Trait
    5. 型变与子类型、PhantomData 与 drop check、高阶约束、重借用,以及借用检查器仍然说不的地方。

      1. 01型变与子类型
      2. 02PhantomData 与 drop check
      3. 03闭包中的 HRTB
      4. 04重借用与两阶段借用
      5. 05NLL 的局限
    6. const 泛型、const fn、零大小类型,以及让无效状态无法通过编译的类型状态 API。

      1. 01const 泛型
      2. 02const fn
      3. 03零大小类型
      4. 04类型状态 API
    7. From 和 TryFrom、AsRef 和 Borrow、Cow,以及每种在何时才是正确的签名。

      1. 01From、Into 和 TryFrom
      2. 02AsRef 和 Borrow
      3. 03Cow 和 ToOwned
    8. 完整的迭代器家族、索引、一致的 Eq、Ord 和 Hash,以及正确实现的 Display、Debug 和 Error。

      1. 01迭代器 trait 家族
      2. 02Index 和 IndexMut
      3. 03Eq、Ord 和 Hash 的一致性
      4. 04Display、Debug 和 Error 设计
    9. 构建器、密封 trait 和扩展 trait、newtype、访问者以及库错误类型:人们乐于使用的 crate 背后的模式。

      1. 01构建器
      2. 02密封 trait
      3. 03扩展 trait
      4. 04Newtype 与 Deref 反模式
      5. 05访问者与双重分发
      6. 06库错误类型
    10. 对 trait 和类型的哪些改动会破坏用户代码,以及如何在不发布大版本的情况下演进 API。

      1. 01trait 和类型中的 semver 风险
    11. 一个带类型的状态机 API 和一个具备完整迭代器套件的泛型容器,分多节课设计和构建。

      1. 01带类型的状态机 API
      2. 02具备完整迭代器套件的泛型容器

像买书一样购买。像教练一样使用。

无需订阅。你一次性购买积分,积分永不过期。一节典型课程大约消耗一个积分;较长的对话或重做会多消耗一点,较短的则少一点。绝不会被中途截断。

免费开始

课程

充值

价格

$0

一次性 $49

$10 或 $25

积分

1,无需信用卡

50,足够一个典型学习者完成一整个模块

在你拥有课程后,再购买 10 或 30 个

每个模块、每项功能

教练提示和逐行追踪

每次提交都有代码审查

快速检查、复习卡片、连续学习记录

有效期

永久

永久

永久

如果我在课程中途用完了怎么办? 只要回复开始时还有积分,就一定会完成。积分为零时,教练会暂停,直到你充值;你做过的一切都不会丢失。账户页面会显示剩余积分。

一次性 $49 —— 足够一个典型学习者完成一整个模块。通过充值添加更多模块。通过 Stripe 进行信用卡支付,并在适用时加上增值税。除法律另有要求外,积分不可退款。

适用条款和条件。

问题

这不就是 Claude 吗?

教练的回复来自 Anthropic 的 Claude。围绕它们的一切都是 rustcoach:一个能编译你的代码并运行真实 cargo test 和 clippy 的沙箱,五个模块,每个模块都有各自的大纲和每个主题的掌握度,跨课程保留的关于你的笔记,间隔复习卡片,以及一个即使你要求也不会替你写出解决方案的教练。

我从未编程过。这适合我吗?

适合。教练会从你已经知道的内容开始教,所以如果没有基础,它会从更早的地方开始,进度也更慢。课程的 50 个积分是按已经会用另一种语言编程的人来设定的,所以完全的新手可能需要在过程中充值。

这门课程需要多长时间?

只要你能坚持:一章在教练确认通过时结束,而不是在固定小时数之后。一节典型课程大约使用一个 credit,而 Course 的 50 个 credits 可让一名典型学习者在已经会用另一种语言编程的情况下完成一个完整模块。

在深入学习模块之前,我需要先学 Core Rust 吗?

如果你是 Rust 新手,请从 Core Rust 开始:它会带你学完整个语言,按照最容易学习的顺序。如果你已经了解一些 Rust,并想深入某个主题,直接进入那个模块即可。每个深入学习模块都以一个简短的 Foundations 章节开头,教练会在其中检查它所依赖的 Rust 知识并填补任何空白,而你在 Core Rust 中已经学过的主题会从一开始就标记为已完成。

我需要按模块付费吗?

不需要。Credits 在你的账户中由所有模块共享。Course 的 50 个 credits 可让一名典型学习者完成一个完整模块;充值则用于下一个模块。

我可以在 IDE 中使用它吗?

还不能。一切都在浏览器中进行:带提示的编辑器、逐行跟踪、侧边栏中的 clippy 注释,以及一个用于尝试各种操作的 scratch.rs。无需安装任何东西。

如果我在课程中途用完 credits 会怎样?

以剩余 credit 开头的回复总会完成。当 credit 为零时,教练会暂停,直到你充值。你的课程、代码和进度都会保持原样。

我可以在注册前检查自己的水平吗?

可以。免费的 Rust 测试大约需要十分钟,无需账户,最后会给出你的水平、一份可分享的报告,以及最适合你的模块。

Krzysztof Grajek

谁构建了 rustcoach

Krzysztof Grajek

我发现了 Rust,并成为其生态系统的热情倡导者。我正在积极努力吸引更多开发者和项目加入 Rust,分享关于其内存安全、并发模型以及在生产环境中日益广泛采用的见解。

如果你对函数式编程、Rust 或构建能够带来改变的企业级解决方案充满热情,让我们联系吧!

在 LinkedIn 上联系

rustcoach条款隐私退款联系

服务条款

最后更新:2026 年 9 月 24 日

1. 我们是谁

1.1. rustcoach 由 SOFTBERRIES Krzysztof Grajek 运营,地址为 ul. Zagonowa 1/1, 82-300 Elbląg, Poland,增值税号(NIP):PL5782712816(“提供商”、“我们”)。

1.2. 你可以通过 support@rustcoach.dev 或通过联系页面联系我们。

1.3. 本服务条款(“条款”)是依据 2002 年 7 月 18 日波兰《以电子方式提供服务法》第 8 条所指含义,以电子方式提供服务的规章。

2. 定义

2.1. “服务”:rustcoach Web 应用程序,一个 AI 教练,通过对话教授 Rust、编写作业、在沙盒中运行你的测试并审查你的代码。

2.2. “用户”(“你”):任何创建账户并使用服务的个人。

2.3. “消费者”:为与其贸易或职业无直接关系的目的使用服务的自然人用户。在波兰法律要求的情况下,保护消费者的规定也适用于为其非专业性质目的使用服务的个体经营者(przedsiębiorca na prawach konsumenta)。

2.4. “Credit”和“credits”:你账户中的预付辅导。一个 credit 是教练模型时间的固定量(第 6 节)。

3. 服务

3.1. 本服务提供由 AI 教练为你编写的课程、通过运行你的代码来验证的作业、代码审查、快速检查、间隔复习卡片以及带有进度的按账户教学大纲。

3.2. AI 披露。 教练是人工智能系统,不是人类。其课程、提示、解释和审查均由 AI 语言模型生成。本通知根据 (EU) 2024/1689 号条例(《人工智能法案》)第 50 条发出。

3.3. 教练可能会犯错。本服务是学习辅助工具;它不提供认证教学、考试或资格证书。

4. 技术要求

4.1. 你需要一台可联网的设备,以及最新版本的 Chrome、Firefox、Safari 或 Edge,和一个有效的电子邮件地址。

4.2. 本服务使用一个严格必要的会话 cookie、Google 登录期间的两个短期 cookie,以及用于编辑器偏好的本地浏览器存储,如隐私政策所述。访问量通过托管在我们自己服务器上的隐私友好、无 cookie 的分析工具(Umami)进行统计,该工具也在那里说明。不使用广告跟踪器。

5. 账户与资格

5.1. 使用本服务需要以电子邮件地址或通过 Google 登录创建账户,并接受本条款。

5.2. 本服务面向 16 岁及以上的用户。 创建账户即表示你确认自己至少年满 16 岁。

5.3. 你有责任对你的凭据保密,并对你账户上的活动负责。每人一个账户;账户为个人所有且不可转让。

6. 额度、价格与付款

6.1. 辅导为预付费。每个账户一开始都有一个免费额度。更多额度可作为一次性购买购买:

  • 免费开始:$0,无需信用卡,1 个额度。
  • 课程:$49,50 个额度。根据我们的经验,对于已经会用另一种语言编程的典型学习者来说,这足够完成一个完整模块;能用多久取决于你如何使用教练。
  • 充值:$10 购买 10 个额度,或 $25 购买 30 个额度,适用于已购买课程的账户。

6.2. 价格以美元标示,不含增值税;结账时显示的价格包含适用于你的增值税。

6.3. 一个额度按标价相当于教练计费模型时间的 $0.60;教练产生的每条回复、审查、提示、追踪和解释都会在发生时从你的额度中计费。一节典型课程大约使用一个额度;长时间对话或重做某个主题会使用更多,快速对话则更少。不会有任何内容被中途截断:只要开始时还有剩余额度,一轮对话就总会完成。账户页面会显示剩余额度以及每次购买。

6.4. 额度与你的账户绑定,不可转让、转售或兑换现金,并且在本服务运营期间一直可用。额度用完后,教练会暂停,直到你充值;你已做的任何内容都不会丢失。免费、促销和善意额度没有现金价值。

6.5. 付款由 Stripe 处理。我们不存储你的卡详细信息。收据通过 Stripe 开具。

6.6. 没有订阅。没有任何内容会自动续订,我们绝不会在你未自行购买的情况下向你收费。

7. 合同订立

7.1. 本服务的合同在你完成注册(免费开始)时,或在你完成额度结账时订立。

7.2. 免费合同为无固定期限。您可以随时要求我们删除您的账户(第13.4条)来终止合同。

8. 撤销权(消费者)

8.1. 作为消费者,您可以在购买后14天内撤销购买,无需说明任何理由。

8.2. 如需撤销,请向 support@rustcoach.dev 发送明确声明,例如使用附件中的示范撤销表格(您没有义务使用该表格)。只要在截止日期前发送声明即可满足期限要求。我们通过电子邮件确认收到。

8.3. 积分的即时可用性。 购买完成后,积分立即添加到您的账户。通过购买,您明确要求我们立即开始提供服务,在撤销期结束之前,并且您承认如果您随后撤销,您需为已使用的部分付费。如果您撤销,我们将在14天内使用相同的付款方式退还已支付的价款减去该次购买中已使用积分的相应比例金额。

8.4. 免费开始。 撤销权同样适用于免费合同。由于未支付任何费用,撤销通过要求我们删除您的账户来行使。

9. 退款

9.1. 积分不可退款,无论已使用或未使用,除非法律另有要求:第8条中的消费者撤销权、第11条中针对不符合约定的法定救济,以及强制性消费者法律赋予您的任何其他权利。积分不可兑换现金。

9.2. 如果您被错误收费或被重复收费,请写信给我们,我们会予以纠正。退款政策以简短形式重申了这些规则。

10. 可接受使用

10.1. 您不得通过本服务提供非法内容,包括侵犯第三方权利或意图骚扰或伤害他人的内容。

10.2. 您不得:(a) 试图未经授权访问本服务或其基础设施,或突破代码沙箱;(b) 挖掘加密货币、攻击其他系统或在沙箱中运行除您的作业以外的任何内容;(c) 干扰或破坏本服务,包括通过自动化批量访问、抓取或转售访问权限;(d) 试图提取、逆向工程或滥用底层AI模型;(e) 共享您的账户或自动化创建账户以获取免费积分。

10.3. 对于违反本条款的账户,我们可以在合理可能的情况下通过电子邮件通知您后暂停或限制该账户,并可以因重大或多次违规而终止合同(第12.3条)。

11. 符合性与投诉

11.1. 根据2014年5月30日《波兰消费者权利法》第5b章关于数字服务的法定制度,我们对消费者承担本服务符合合同的义务。如果本服务不符合合同,您可以要求使其符合合同,并在法定条件下要求降价或撤销合同。

11.2. 投诉可提交至 support@rustcoach.dev 或通过联系页面提交。请描述问题、您的账户电子邮件以及(如相关)涉及的课程。

11.3. 我们在收到消费者投诉后 14 天内予以答复。若我们未在该期限内答复,则视为投诉已被接受。

12. 服务变更、关闭与终止

12.1. 变更。 rustcoach 是一项小型服务,将持续变化。我们可能会增加、更改或移除功能、模型、课程内容及限制。若变更会减少您现有 Credit 所能购买的内容,我们会在生效前至少 14 天通过电子邮件通知。

12.2. 关闭服务。 我们可能随时全部或部分停止服务,包括因运营不再可行。若我们关闭服务,我们会通过电子邮件至少提前 30 天通知,在此期间您可以继续使用您的 Credit 并索取您的数据副本。关闭时未使用的 Credit 不予退款,除非强制性法律要求;免费、促销及善意赠送的 Credit 一律不予退款。

12.3. 我方终止。 对于严重或反复违反第 10 条的行为,我们可在适当情况下经过 10.3 条的中止程序后,不经通知终止合同。因违约而被终止的账户中未使用的 Credit 不予退款。

12.4. 不活跃账户。 连续三年无活动的账户,可在提前 30 天发送电子邮件通知后关闭;届时账户中剩余的任何 Credit 将被没收。

13. 您的内容、知识产权、删除

13.1. 本服务,包括其软件、设计和课程材料,受提供方或其许可方的知识产权保护。请勿复制、抓取或转售。

13.2. 您编写的代码仍归您所有。您仅授予我们为提供服务所必需的技术许可:存储您的代码和课程对话、运行您的测试,以及将您的代码发送给 AI 模型进行审查,具体如隐私政策所述。

13.3. AI 生成的课程、提示和审查内容仅供您个人学习使用。

13.4. 您可以随时从账户页面删除您的账户(或通过电子邮件发送至 support@rustcoach.dev)。账户将立即退出登录,并在 30 天后永久删除;在这 30 天内登录将取消删除。删除您的账户即终止合同,任何未使用的 credits 也随之作废,但您对过去 14 天内购买的服务仍享有第 8 条规定的撤销权。

14. 责任

14.1. 本条款中的任何内容均不排除或限制根据适用法律无法排除或限制的责任,包括提供方对消费者以及按消费者条款使用服务的个体经营者的责任,以及故意造成损害的责任,该责任绝不排除。

14.2. 对于因不可抗力、第三方网络或 AI 提供方故障、您的互联网连接,或您的设备不符合第 4 条要求而导致的中断或质量下降,我们概不负责。

14.3. 我们可能进行计划内维护,并在合理可能的情况下提前通知。维护不会消耗您的 Credit。

14.4. 仅适用于非消费者。对于非消费者用户(且非按消费者条款行事的个体经营者):(a) 我方在合同项下的全部责任限于您在引起索赔的事件发生前 12 个月内向我方支付的金额;(b) 我方不对利润损失承担责任。这些限制不适用于故意造成的损害。

15. 本条款的变更

15.1. 我方可能基于正当理由变更本条款,例如法律变更、服务功能变更、安全需求,或价格或第三方成本变更。

15.2. 我方在变更生效前至少 14 天通过电子邮件通知您,并说明生效日期。应用还会要求您在接受新版本后才能继续使用。

15.3. 如果您不接受变更,您可以在生效日期前要求我方删除您的账户以终止合同;在前 14 天内购买的积分将根据第 8 条予以退款。价格变更绝不影响您已持有的积分。

16. 庭外争议解决

16.1. 如果我方驳回消费者投诉,我方会在回复中说明是否同意参与庭外争议解决(ADR)程序,如同意,则指明有管辖权的 ADR 机构。

16.2. 波兰的消费者可以(除其他途径外)向其居住地有管辖权的省贸易检查局(Wojewódzki Inspektorat Inspekcji Handlowej)以及市或区消费者监察专员(miejski/powiatowy rzecznik konsumentów)寻求协助。这些途径对双方均为自愿性质。

17. 适用法律与管辖权

17.1. 本条款受波兰法律管辖。如果您是消费者,这一法律选择不会剥夺您惯常居所所在国法律中强制性消费者保护条款所赋予您的保护(欧洲议会和理事会第 593/2008 号条例(罗马 I)第 6 条)。

17.2. 与消费者的争议由根据一般适用法律具有管辖权的法院解决。对于非消费者,由服务提供者所在地有管辖权的法院管辖。

18. 个人数据与最终条款

18.1. 我方如何处理个人数据载于隐私政策,该政策构成缔约前信息的一部分,但不构成合同条款的一部分。

18.2. 本条款在合同订立前免费以英文提供,其形式允许存储和复制(本页面可保存或打印)。如任何条款被认定无效,其余条款仍然有效。

附件:示范撤销表格

(仅在您希望撤销合同时填写并返还本表格)

致:SOFTBERRIES Krzysztof Grajek, ul. Zagonowa 1/1, 82-300 Elbląg, Poland,电子邮件: support@rustcoach.dev

本人/我们(*)特此通知,本人/我们(*)撤销就以下服务供应所订立的本人/我们(*)合同:rustcoach Credit(购买:……………,日期:……………)

消费者姓名:……………
消费者地址:……………
账户电子邮件地址:……………
消费者签名(仅当本表格以纸质方式通知时):……………
日期:……………

(*) 酌情删除。

rustcoach条款隐私退款联系我们

隐私政策

最后更新:2026年9月29日

1. 控制者

1.1. 您个人数据的控制者是 SOFTBERRIES Krzysztof Grajek,地址:ul. Zagonowa 1/1, 82-300 Elbląg, Poland,增值税号(NIP):PL5782712816。

1.2. 所有隐私事务的联系方式:support@rustcoach.dev。

1.3. 本政策说明当您使用 rustcoach(一款 AI Rust 教练,以下简称“服务”)时,我们如何处理个人数据。服务条款中定义的术语在此具有相同含义。

2. 我们处理哪些数据

2.1. 账户数据:电子邮件地址、可选姓名、密码哈希(或如果您使用 Google 登录,则为 Google 账户标识符)、账户创建日期、您接受的条款版本,以及您的提醒邮件偏好。

2.2. 学习数据:与教练的课程对话、作业以及您编写和提交的代码、测试和 lint 输出、快速检查答案、复习卡片和答案、教练关于您进度的教学大纲笔记和掌握程度估计,以及您活跃的日期。

2.3. 使用和积分数据:每次教练对话的 token 数量和计量成本,以及授予、购买和调整积分的分类账。您的余额由此计算得出。

2.4. 账单数据:您的 Stripe 客户 ID 以及每次购买的记录(产品、金额、Stripe 会话 ID)。付款和发票记录由 Stripe 保存;我们绝不会看到您的完整卡详细信息。

2.5. 邮件日志:我们向您发送了哪些账户邮件和提醒以及发送时间,以确保不会重复发送邮件。

2.6. 联系表单:您发送给我们的姓名、电子邮件地址和消息。

2.7. 技术数据:会话 cookie,以及为安全、速率限制和故障排除而保留的服务器日志(包括 IP 地址)。

2.8. 使用统计:打开了哪些页面和屏幕、来源网站、浏览器、操作系统、设备类型、屏幕尺寸、语言和国家/地区。这些数据通过 Umami 收集,这是一款在我们自己的服务器上运行的开源分析工具,不使用 cookie,也不收集个人数据。访问通过将 IP 地址、浏览器和网站与每月更换的盐值组合后进行单向哈希来计数,因此无法在较长时间内识别访客。屏幕地址的发送不包含账户标识符或登录链接。

2.9. 嵌入视频:主页显示来自我们自己服务器的视频预览图像。在您点击播放之前,不会从 YouTube 加载任何内容。当您点击播放时,您的浏览器会从 youtube-nocookie.com(YouTube 的隐私增强模式)加载播放器,YouTube 会收到您的 IP 地址和浏览器数据。我们不会从 YouTube 收到关于您的任何信息。

2.10. Rust 测试结果:您被问到的问题、您的答案和您的得分,存储时不包含您的姓名、电子邮件或 IP 地址。任何拥有结果链接的人都能看到其摘要:得分、级别、每个领域的条形图以及推荐模块。您最强和最弱的主题以及带有您答案的问题仅向您显示。如果您将结果保存到您的账户,它会与您的账户关联;删除您的账户会将其分离,但共享链接仍然有效。

3. 目的和法律依据(GDPR)

目的数据法律依据
提供服务:使用 AI 模型生成课程、提示、解释和复习,运行您的代码,跟踪进度学习数据、账户数据合同履行,GDPR 第 6(1)(b) 条
账户管理、登录、Credit 记账账户、使用和 Credit 数据合同履行,GDPR 第 6(1)(b) 条
提供 Rust 技能测试及其结果页面Rust 测试结果(第 2.10 节)正当利益,GDPR 第 6(1)(f) 条
将保存的测试结果告知你的教练,以便按你的水平开始第一课Rust 测试结果(第 2.10 节)同意,GDPR 第 6(1)(a) 条,通过复选框征得你的同意,可随时通过结果页面上的开关撤回
开具发票、税务和会计记录账单数据法律义务,GDPR 第 6(1)(c) 条
安全、滥用和欺诈防范、速率限制、故障排查技术数据正当利益,GDPR 第 6(1)(f) 条
汇总使用统计,以了解哪些页面被使用并改进服务使用统计(第 2.8 节)正当利益,GDPR 第 6(1)(f) 条
关于你自己学习的提醒邮件(服务相关,非营销)电子邮件地址、邮件日志正当利益,GDPR 第 6(1)(f) 条,可选择退出(第 6 节)
回复联系表单消息、投诉、撤回请求和法律索赔联系表单数据、账户和账单数据、往来通信法律义务和正当利益,GDPR 第 6(1)(c) 和 (f) 条

3.1. 教练会根据你已学内容调整课程。这是内容个性化, 对你没有法律或类似重大影响。我们不进行 GDPR 第 22 条 意义上的自动化决策。

4. 接收方和国际传输

我们仅与服务运行所需的处理者共享数据:

处理者角色位置传输机制
AnthropicAI 模型:课程对话和提交的代码会发送到 Claude API,以生成教练的回复和点评美国标准合同条款(SCC)
Stripe支付、收据、增值税美国欧盟-美国数据隐私框架
Google仅用于使用 Google 登录(OAuth)美国欧盟-美国数据隐私框架
Brevo账户邮件、提醒、联系表单消息的投递欧盟(法国)不适用(欧盟)
OVHcloud (OVH Hosting Inc.)应用托管:服务器、数据库、代码沙箱和自托管的 Umami 分析加拿大(魁北克省 Beauharnois)欧盟对加拿大的充分性决定(委员会决定 2002/2/EC)

4.1. 相关保障措施的副本可通过 support@rustcoach.dev 索取。我们不出售 个人数据,也不与广告商共享。

4.2. YouTube 不是我们的处理者。如果你播放首页上的视频(第 2.9 节), 运营 YouTube 的 Google 将作为独立控制者,依据其自身的 隐私政策处理你的数据:https://policies.google.com/privacy。

5. 保留

数据保留期限
账户数据、学习数据、使用和 Credit 账本、邮件日志直至账户删除(你提出请求后 30 天),另加备份中最多 30 天
Rust 测试结果(第 2.10 节)未完成的测试在 7 天后删除;已完成的结果无限期保留,因为你分享的结果需要保持链接可用。删除账户会将保存的结果与账户分离,而不是删除该结果,因此分享的链接仍可使用且不会识别出你
支付记录(由 Stripe 持有)5 个完整纳税年度,按波兰税法要求
联系表单消息up to 12 months in our support mailbox, longer only while a complaint or claim is open
Server logsup to 30 days

6. Reminder emails

6.1. We send occasional reminder emails about your own learning: an open lesson, review cards piling up, a quiet few weeks. These are service-related messages, not marketing, sent on the basis of our legitimate interest in supporting your use of the Service, never more than one every three days.

6.2. Reminders are enabled by default. You can turn them off at any time with the switch on the Account page or the one-click link in every reminder email. Account emails (verification, password reset, receipts, running-low notices) are not affected.

7. Cookies and local storage

7.1. We use only strictly necessary storage: rc_session, the sign-in cookie, lifetime 30 days; rc_oauth_state and rc_terms, two cookies that live 10 minutes during a Google sign-in; and local browser storage for editor preferences (pane sizes, whether hints and traces were shown, the file you had open), for the onboarding tour state, a note that you are signed in, so the site can skip the landing page on your next visit, and, if you take a Rust test before signing in, a one-time token that lets you save that result to your account afterwards – strictly necessary to link a result you took anonymously to the account you sign into next, and cleared from your browser on sign-out or account deletion.

7.2. Our analytics (Umami, section 2.8) sets no cookies and stores nothing on your device. We use no advertising and no third-party tracking cookies, so no cookie consent banner is required.

7.3. During checkout you are redirected to stripe.com, where Stripe sets its own cookies under its own policy: https://stripe.com/cookies-policy/legal.

7.4. If you click play on the video on the home page, YouTube may store cookies or similar data on your device under its own policy. This happens only after that click; before it, no YouTube content is loaded.

8. Your rights

8.1. Under the GDPR you have the right to: access your data; rectification; erasure; restriction of processing; data portability; and to object to processing based on legitimate interest (including reminder emails, section 6).

8.2. To exercise any right, email support@rustcoach.dev or use the contact page. We respond within one month (extendable by two months for complex requests, with notice).

8.3. Account deletion: delete your account from the Account page, or ask us by email from the address on your account. The account is signed out at once and, after a 30-day grace period during which signing in restores it, permanently erased: email, name, password, Google sign-in link, lessons, messages, code, usage and credit records. Payment records stay with Stripe as long as tax law requires (section 5). Backups are purged within a further 30 days.

8.4. Complaint to a supervisory authority: you may lodge a complaint with the President of the Personal Data Protection Office (Prezes UODO), ul. Stawki 2, 00-193 Warszawa, Poland, uodo.gov.pl, or with the supervisory authority of your habitual residence.

9. Children

9.1. The Service is intended for users aged 16 or older. We do not knowingly process data of children under 16. If you believe a child under 16 has created an account, contact us and we will delete it.

10. Security

10.1. We apply technical and organisational measures appropriate to the risk, including encrypted transmission (TLS), hashed passwords, access controls, rate limiting, and running your code in an isolated sandbox with no network access.

11. Changes to this policy

11.1. We may update this policy, for example when we change processors or features. We notify account holders of material changes by email at least 14 days before they take effect. The current version is always available in the Service.

rustcoachTermsPrivacyRefundsContact

Refund Policy

Last updated: 22 September 2026. The short form of sections 8, 9 and 12 of the Terms of Service, which prevail.

Within 14 days of a purchase

If you are a consumer you can withdraw from any purchase within 14 days of making it, no reason needed. Because credit is available immediately, you asked us at checkout to start right away; we therefore refund the price minus a proportional amount for the credits you used from that purchase, within 14 days, to the original payment method. Send us a plain statement, or the model form at the end of the Terms, from the address on your account.

Everything else

Credits are non-refundable, used or unused, except where the law requires otherwise. They stay on your account and never expire. If you were charged in error or charged twice, write to us and we correct it. If the service does not work as promised, the complaints procedure below applies. An account closed for breaking the terms is not refunded, and free, promotional or goodwill credits are never refunded.

Complaints

If something did not work as promised, tell us: we answer consumer complaints within 14 days, and if we do not, the complaint counts as accepted.

How to reach us

Email support@rustcoach.dev from the address on your account, or use the contact page, with the purchase date and amount. Refunds go back to the original payment method via Stripe, usually within 5 to 10 business days.

SOFTBERRIES Krzysztof Grajek, ul. Zagonowa 1/1, 82-300 Elbląg, Poland, VAT ID (NIP): PL5782712816.

rustcoachTermsPrivacyRefundsContact

The terms have changed

Before you continue, please read and accept the current version.

Everything on your account stays as it is. What changed is written down in the Terms of Service, the Privacy Policy and the Refund Policy; the short version is that credits are non-refundable except where the law requires it, and that the service can be changed or closed.

Skip to content

0

Assignment

Tests (read-only)

·0 lines

Run tests to see results here.

      Raw output

      Choose your module

      Each module is its own course with its own lessons and progress. Your credits work in all of them, and you can add or switch modules any time.

      来源:Hacker News · rustcoach.dev