改进rust代码的35种具体方法-简介(一)

这个是我翻译《Effective Rust》书籍,我看过后觉得非常有用,所以翻译一下放CSDN上,望各位批评指正。

介绍

代码更像是你所说的'准则',而不是实际规则。-赫克托·巴博萨

Scott Meyers的原版《有效C++》一书非常成功,因为它引入了一种新风格的编程书籍,专注于从用C++创建软件的现实世界经验中学到的指南集。重要的是,这些指导方针是在它们必要的原因的背景下解释的——允许读者自己决定他们的特定场景是否需要违反规则。

有效C++》第一版于1992年出版,当时C++虽然年轻,但已经是一种微妙的语言,包括许多脚枪;拥有不同特征的交互指南至关重要。

Rust也是一种年轻的语言,但与C++相比,它显然没有脚枪。其类型系统的强度和一致性意味着,如果Rust程序编译,它已经有相当大的机会发挥作用——这种现象以前只有在Haskell等更学术性、更易于访问的语言中才能观察到。

然而,这种安全性——无论是类型安全还是内存安全——确实有成本。Rust以拥有陡峭的坡道而闻名,新来者必须经历与借款检查员作斗争的入门仪式,重新设计他们的数据结构,并被终身困惑。编译的Rust程序可能很有可能正常工作,但即使有Rust编译器非常有用的错误诊断,编译它的困难也是真实的。

因此,这本书的针对水平与其他有效<语言>书籍略有不同;有更多项目涵盖了Rust的新概念,尽管官方文档已经包含了这些主题的良好介绍。这些物品有“理解...”和“熟悉...”等标题。

Rust的安全也导致完全没有标题为“Never...”的项目。如果你真的不应该做某事,编译器通常会阻止你这样做。

也就是说,文本仍然假设对语言基础知识有理解。它还假设了2018年版的Rust,使用稳定的工具链。

用于代码片段和错误消息的特定rustc版本是1.60。Rust现在足够稳定(并有足够的向后兼容性保证),因此代码片段不太可能需要对后续版本进行更改,但错误消息可能因您的特定编译器版本而异。

该文本还对C++进行了一些引用和比较,因为这可能是最接近的等效语言(特别是C++11的移动语义),也是Rust新来者最有可能遇到的先前语言。

构成这本书的项目分为六个部分:

  • 类型:围绕Rust的核心类型系统的建议。
  • 概念:构成Rust设计的核心想法。
  • 依赖项:使用Rust软件包生态系统的建议。
  • 工具:关于如何通过超越Rust编译器来改进代码库的建议。
  • 异步Rust:使用Rustasync机制的建议。
  • 超越标准Rust:当您必须在Rust标准、安全环境之外工作时的建议。

虽然“概念”部分可以说比“类型”部分更基本,但它被故意放在第二位,以便从头到尾阅读的读者可以首先建立一些信心。

以下标记从Rust Book中借用Ferris,用于识别某种方式不正确的代码。

Ferris       代表意思
此代码无法编译!
这个代码惊慌失措!
此代码块包含不安全的代码.
此代码不会产生所需的行为。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 感知机学习是一基本的机器学习算法,用于解决二分类问题,在 Rust 中,可以使用如下代码来实现:fn perceptron (weights: &[f64], input: &[f64]) -> f64 { let mut sum = 0.0; for i in 0..weights.len() { sum += weights[i] * input[i]; } if sum > 0.0 { 1.0 } else { -1.0 } } ### 回答2: 感知机学习方法是一简单而有效的二分类算法,可以用于对给定的数据进行分类。以下是使用Rust编写的感知机学习方法的示例代码: ```rust use rand::{thread_rng, Rng}; struct Perceptron { weights: Vec<f64>, learning_rate: f64, } impl Perceptron { fn new(num_features: usize, learning_rate: f64) -> Self { let mut rng = thread_rng(); let weights: Vec<f64> = (0..num_features).map(|_| rng.gen_range(-1.0..1.0)).collect(); Perceptron { weights, learning_rate, } } fn activate(&self, features: &Vec<f64>) -> f64 { let weighted_sum: f64 = features.iter().zip(&self.weights) .map(|(x, w)| x * w) .sum(); if weighted_sum >= 0.0 { 1.0 } else { -1.0 } } fn train(&mut self, features: &Vec<f64>, target: f64) { let prediction = self.activate(features); let error = target - prediction; for (weight, feature) in self.weights.iter_mut().zip(features.iter()) { *weight += self.learning_rate * error * feature; } } } fn main() { let training_set = vec![ (vec![0.0, 0.0], -1.0), (vec![0.0, 1.0], -1.0), (vec![1.0, 0.0], -1.0), (vec![1.0, 1.0], 1.0), ]; let mut perceptron = Perceptron::new(2, 0.1); for _ in 0..100 { for (features, target) in &training_set { perceptron.train(features, *target); } } let test_data = vec![ vec![0.0, 0.0], vec![0.0, 1.0], vec![1.0, 0.0], vec![1.0, 1.0], ]; for features in &test_data { let prediction = perceptron.activate(features); println!("Input: {:?} - Prediction: {}", features, prediction); } } ``` 在这段代码中,我们定义了一个`Perceptron`结构体,它包含了权重向量和学习率。`activate`函数用于计算加权和并将其经过阈值函数进行分类。`train`函数根据误差调整权重向量。在`main`函数中,我们定义了一个训练集和测试集,并使用感知机算法对训练集进行训练。接着对测试集进行分类预测并输出结果。 请注意,本示例代码可能不是最优的实现方式,但足够演示感知机学习方法的基本原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值