首页
学习
活动
专区
圈层
工具
发布

2018年伊始,系统编程语言Rust为何令程序员感到兴奋?

在Rust中,可以控制程序的每一个方面—确切地知道系统调用它做什么,它分配的内存,它休眠了多少微秒—一切。在C语言中可以做的任何事情,都可以在Rust中做。...Rust就像我的超级英雄语言!如果想做一些奇怪的系统魔法的东西,用Rust是可能的。也许不容易,但可能! bindgen和宏是惊人的 已经写过关于bindgen和宏的博客文章,但想再谈谈它们!...然后使用宏(参见:我的第一个Rust宏),并写了一堆代码引用这35个不同的结构版本,确保我的代码以及所有代码都能正常工作。...大部分Firefox都是用Rust编写的,Rust大大提高了Firefox的性能。 Rust是为C / C ++专家而设的,他们希望有更好的关于未定义行为的编译时间保证。...Rust能够为不同群体提供服务是令人兴奋的,就像Rust适合那些希望能够编写C / C ++但是又发现这些语言很难的人们一样,Rust 也适合希望从他们的系统编程语言中得到更多的C / C ++专家。

4.9K100

【Rust学习】18_常见集合_String

我们将字符串作为集合来讨论,因为字符串被实现为一个字节集合,加上一些方法,以便在将这些字节解释为文本时提供有用的功能。在本节中,我们将讨论每个集合类型都有的 String 操作,例如创建、更新和读取。...换句话说,它看起来正在制作很多副本,但事实并非如此;实现比复制更有效。...使用 format! 的代码版本更易于阅读,并且由 format! 宏生成的代码使用引用,因此此调用不会占用其任何参数的所有权。...使用索引读取字符串在许多其他编程语言中,通过索引访问字符串中的单个字符是有效且常见的操作,但是在Rust中如果你尝试这种操作,你会得到一个错误,现在让我们一起来尝试下。...如果我们看一下用梵文书写的印地语单词“नमस्ते”,它被存储为 u8 值的向量,如下所示:[224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165,

41710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    提高代码逼格的利器:宏定义-从入门到放弃

    就比如 C 语言中的宏定义,好像跟我犯冲一样,我一直觉得宏定义是 C 语言中最难的部分,就好比有有些小伙伴一直觉得指针是 C 语言中最难的部分一样。...; 我们在写代码的时候,所有使用宏名称的地方,都可以理解为一个占位符。...在编译程序的预处理环节,这些宏名将会被替换成宏定义中的那些代码段,注意:仅仅是单纯的文本替换。 1....但是如果这样来使用宏: debug3("hello \n"); 编译的时候,会出现错误: error: expected expression before ‘)’ token。为什么呢?...我一直坚信,模仿是成为高手的第一步,只有见多识广、多看、多学习别人是怎么来使用宏的,然后拿来为己所用,按照“先僵化-再优化-最后固化”这个步骤来训练,总有一天你也能成为高手。

    1.6K41

    Swift 周报 第三十二期

    可以尝试创建一个可以导入 UIKit 的“Mac Catalyst”宏,但即使有可能,也可能没有用 提议低级联动控制属性:@used 和@section[5] 动机 动机有两个目标: 提供低级构建块来构建更多高级...+17 -I cxx -c -parse-as-library 并尝试在 MyApp.swift 中使用 Some_Class ,但显然找不到该类。...尝试使用 -D UNIX_ENABLED 但这没有帮助。 有什么想法可以进行此编译吗?...讨论宏扩展后访问源代码[8] 当构建一个使用 SwiftSyntax 遍历 Swift 源代码的工具时,是否有一种直接的方法来遍历宏扩展后的源代码? 这是否需要通过尝试扩展每个源文件来手动完成?...正在构建的工具中,复制源文件并对其进行操作,但这是直接来自文件系统和预扩展的。具体来说,该工具会遍历有效的 .swift 文件并捕获符合给定协议的所有类型。

    79930

    语法分析器(Parser)的实现

    : static int CurTok; static int getNextToken() { return CurTok = gettok(); } 这段代码以词法分析器为中心,实现了一个简易的语元缓冲...= ',') return Error("Expected ')' or ',' in argument list"); getNextToken(); } }...这里的map简化了新运算符的添加,同时也可以证明我们的算法与具体的运算符无关。当然,要想去掉map直接在GetTokPrecedence中比较优先级也很简单。(甚至可以直接使用定长数组)。...运算符优先级解析的基本思想就是通过拆解含有二元运算符的表达式来解决可能的二义性问题。以表达式“a+b+(c+d)*e*f+g”为例,在进行运算符优先级解析时,它将被视作一串按二元运算符分隔的主表达式。...LHS = new BinaryExprAST(BinOp, LHS, RHS); } } 看一下主表达式右侧的二元运算符,我们发现它的优先级比当前正在解析的binop的优先级要高。

    2.3K30

    Google Test(GTest)使用方法和源码解析——断言的使用方法和解析

    我们再查看下二进制对比系列宏的ASSERT_*和EXPECT_*的区别(以EQ为例) #define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)...一般来说二进制比较,都是对比其结构体所在内存的内容。C++大部分原生类型都是可以使用二进制对比的。但是对于自定义类型,我们就要定义一些操作符的行为,比如=、使用SUCCEED()宏标记成功,使用FAIL()宏标记致命错误(同ASSERT_*),ADD_FAILURE()宏标记非致命错误(同EXPECT_*)。...foo.Bar(); } 异常断言         异常断言是在断言中接收一定类型的异常,并转换成断言形式。...参数名输出断言         在之前的介绍的断言中,如果在出错的情况下,我们会对局部测试相关信息进行输出,但是并不涉及其可能传入的参数。参数名输出断言,可以把参数名和对应的值给输出出来。

    6.1K20

    Java并发编程CAS

    CAS 并发原体现在 JAVA 语言中就是 sun.misc.Unsafe 类中的各个方法。调用 UnSafe 类中的 CAS 方法,JVM 会帮我们实现出 CAS 汇编指令。...由于 CAS 是一种系统源语,源语属于操作系统用语范畴,是由若干条指令组成,用于完成某一个功能的过程,并且原语的执行必须是连续的,在执行的过程中不允许被中断,也就是说 CAS 是一条原子指令,不会造成所谓的数据不一致的问题...,var4为1,var5为getIntVolatile(var1, var2)的返回值,getIntVolatile方法的意思是当前对象var1且内存偏移量为var2时的值是多少。...,其内部方法可以像c的指针一样直接操作内存。...(ex); } } private volatile int value; // ... } CAS 的缺点 循环时间长开销很大 如果 CAS 失败,会一直尝试,如果 CAS

    62020

    Rust 错误处理

    () 是一种宏,用于处理程序中出现错误的情况。当你的代码检测到出现错误并需要立即触发 panic 时,就可以使用这个宏。panic!() 可以接受类似于 println!...,它是 Result 的别名,但将错误类型硬编码为 std::io::Error。...(get_weather(hometown)); 此宏会扩展为一个 match 表达式,就像之前那段代码一样。 人们很难意识到在程序中出现错误的情况有多普遍,尤其是在与操作系统交互的代码中。?...例如,在第 18 章中,你会看到 Write 特型为文本和二进制输出定义了一组泛型方法(.write() 等)。...如果你正在编写一个从文本文件加载数百万条记录的程序,并且需要一种方法来处理大多数时候会成功但偶尔也会失败的可能结果,就可以用向量 Result 在内存中表达出现这种结果时的情形。

    95510

    REST API 设计最佳实践:如何构建、设计和使用 API ?

    但是,我也曾遇到过一些让 REST 蒙羞的 API 例子,错误使用 HTTP 状态码、纯文本响应、不一致的模式、插入端点中动词......REST以资源为导向,资源由URI表示:/library/ 端点(endpoint)是动词和URI的组合,例如:GET: /books/ 端点可以理解为对资源执行的操作。...不要返回纯文本 尽管并非强制规定的,但大多数REST API通常约定使用JSON作为数据格式。然而,仅返回包含JSON格式字符串的响应体是不够好的。您还应该指定Content-Type标头。...HTTP/1.1 400 Bad Request Content-Type: application/json{ "error": "Expected at least three items...如果您更喜欢使用Django,那么首选就是Django REST框架。虽然它不如其他框架直观,但功能非常强大。在Node中,Restify似乎也是一个很好的选择,尽管我还没有尝试过。

    2.2K40

    《ChatGPT Prompt Engineering for Developers》中文笔记、二

    LLM 的应用,包括:书写 Prompt 的原则; 文本总结(如总结用户评论); 文本推断(如情感分类、主题提取); 文本转换(如翻译、自动纠错); 扩展(如书写邮件); 项目意义 LLM 正在逐步改变人们的生活...大家可以自己尝试不同的变化,或者甚至尝试完全不同的评论,看看是否仍然可以准确地提取这些内容。 推断主题 大型语言模型的一个很酷的应用是推断主题。给定一段长文本,这段文本是关于什么的?有什么话题?...一般来说,在构建需要可预测响应的应用程序时,我建议使用温度为零。在所有课程中,我们一直设置温度为零,如果您正在尝试构建一个可靠和可预测的系统,我认为您应该选择这个温度。...我们由衷地为您在购买过程中遇到的问题表示抱歉。我们确实在12月份的第二周调整了价格,但这是由于市场因素所致,并非价格欺诈。...而使用温度为0.7,则每次都会获得不同的输出。 所以,您可以看到它与我们之前收到的电子邮件不同。让我们再次执行它,以显示我们将再次获得不同的电子邮件。 因此,我建议您自己尝试温度,以查看输出如何变化。

    3.5K101

    基础渲染系列(二)——着色器

    顶点程序和片段程序被编写为方法,就像在C#中一样,通常也被称为函数。让我们简单地创建两个具有适当名称的空void方法。 ? 此时,着色器将正常编译,但球体将消失。如果没消失,说明你的编译仍然有错。...我们也可以为此使用float4。返回0将产生可靠的返回。 ? alpha为0不会完全透明吗? 除非我们的着色器实际上忽略了Alpha通道,不然肯定会。因为我们正在使用不透明的着色器。...幸运的是,我们可以做到。 我们可以定义数据结构,它只是变量的集合。类似于C#中的结构,但语法略有不同。这是一个定义我们要插值的数据的结构。注意定义后使用分号。 ?...我们可以将其用作方便的速记。 什么是宏? 宏类似于一个函数,在预处理代码阶段之前对其进行展开,然后对展开后的代码进行编译。这允许对代码进行文本操作,例如将_ST附加到变量名。...TRANSFORM_TEX宏使用此技巧。如果你好奇的话,可以看看它的定义。 ? 宏启用了各种巧妙的技巧,但也可能导致难以理解的代码和非常讨厌的错误。这就是为什么C#没有宏的原因。

    5.2K20

    降本增笑的P0事故背后,是开猿节流引发的代码异常吗?

    一个典型的 errno 使用例子是尝试打开一个文件,如果文件不存在,fopen 函数会返回 NULL,并设置 errno 为 ENOENT("No such file or directory"的错误码...而 C 语言中大量使用空指针来表示返回结果失败。...需要框架额外操作才能保证原子性,不过新的编译期已使用 errno 宏来作为实现,这样保证了线程中独立的副本,但如果使用其他协程框架,还需要进一步保证 ❌ 无法返回错误具体原因 虽然使用 strerror...= std::move(r.value()); return 0; } 比起使用 std::expected Outcome 使用了宏来代替级联的失败,这样而由于所有的 result 构造函数都采用了...优劣 描述 ✔️ 将选择权交给使用者 使用者可以选择异常版本和非异常版本 ❌ 库的编写方式用起来很麻烦 每次都要写两个版本的函数重载 ❌ 调试信息缺失 单一的 std::error_code 并不能在使用时提供上下文相关的错误文本

    1.7K101

    降本增笑的背后,是开猿节流的异常

    一个典型的 errno 使用例子是尝试打开一个文件,如果文件不存在,fopen 函数会返回 NULL,并设置 errno 为 ENOENT("No such file or directory"的错误码...而 C 语言中大量使用空指针来表示返回结果失败。...需要框架额外操作才能保证原子性,不过新的编译期已使用 errno 宏来作为实现,这样保证了线程中独立的副本,但如果使用其他协程框架,还需要进一步保证 ❌ 无法返回错误具体原因 虽然使用 strerror...= std::move(r.value()); return 0; } 比起使用 std::expected Outcome 使用了宏来代替级联的失败,这样而由于所有的 result 构造函数都采用了...优劣 描述 ✔️ 将选择权交给使用者 使用者可以选择异常版本和非异常版本 ❌ 库的编写方式用起来很麻烦 每次都要写两个版本的函数重载 ❌ 调试信息缺失 单一的 std::error_code 并不能在使用时提供上下文相关的错误文本

    74820

    【C语言】词法陷阱与缺陷总结

    由于C语言中的字符串是以字符数组的形式存储的,并且没有直接的方式来知道数组的长度(除非使用额外的变量来跟踪),因此需要一个特殊的字符来标记字符串的末尾。...【C语言】词法陷阱与缺陷(四):符号的解析详解_c语言词法分析歧义-CSDN博客 五、宏定义和预处理指令 宏定义是C语言(以及许多其他编程语言)中预处理指令的一部分,它们在编译之前对源代码进行文本替换。...宏展开时的副作用:宏在展开时只是简单的文本替换,不会进行任何类型检查或语法分析。因此,如果宏的展开结果导致了意外的语法结构或副作用(例如,多次评估宏参数),那么可能会引发编译错误或运行时错误。...is true\n"); // 这行代码会执行,因为c == 3为真,但a 为假,但由于&&优先级高于||,所以先计算c == 3 && a 为假,再与a > b(为真)进行||运算,结果为真...避免方法:宏的参数和替换文本加双重括号,即#define SQUARE(x) ((x)*(x));避免将带副作用的表达式作为宏参数。 问题:C 语言中浮点数隐式转换为整数会发生什么?

    10910

    选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

    并且我们可以将评估调整为特定的数据语料库,这可能与检索增强应用程序(RAG)等情况相关。 我们将使用Llama Index在其文档中建议的简单流程。语料库首先被分成块。...所以我们选择的这一版可以用其他23种欧盟官方语言中的任何一种语言替换URL中的language,检索不同语言的文本(BG表示保加利亚语,ES表示西班牙语,CS表示捷克语,等等)。...OAI-small:text-embedding-3-small,维数为1536。 OAI-ada-002:传统的文本嵌入text-embedding-ada-002,维度为1536。...每个模型在四种不同的语言上进行评估:英语(EN),法语(FR),捷克语(CS)和匈牙利语(HU),分别涵盖日耳曼语,罗曼语,斯拉夫语和乌拉尔语的例子。...在捷克语和匈牙利语等语言中,表现存在显著差异,这可能是因为训练的数据比较少。 我们应该付费订阅OpenAI,还是托管一个开源嵌入模型?

    3.7K10

    SWIG 官方文档第三部分 - 机翻中文人肉修正

    11 Typemaps 11.1 简介 很有可能,您正在阅读本章是出于以下两个原因之一;您要么想自定义 SWIG 的行为,要么无意中听到有人嘟囔着一些关于“typemaps”的难以理解的胡言乱语,然后问自己...匹配类型映射中的特殊变量被扩展为匹配类型映射类型的变量,而不是调用宏的类型映射。实际上,这个宏在脚本目标语言中几乎没有用处。...只使用简单的类型映射,这种类型的转换是可能的,但非常痛苦。多参数类型映射在这种情况下有帮助。 多参数类型映射是一种转换规则,它指定如何将目标语言中的单个对象转换为 C/C++ 中的一组连续函数参数。...大多数读者可能希望跳过关于高级片段使用的接下来的两个小节,除非希望真正掌握一些在 SWIG 类型映射库部分中使用的强大但棘手的宏和片段用法。 11.11.1 片段类型特化 片段可以是专门的类型。...当放置在类型映射中时,它会扩展为上面的 SWIGTYPE_* 类型描述符对象。作为一般规则,您应该始终使用 1_descripto r而不是尝试直接对类型描述符名称进行硬编码。

    4.3K30

    进阶渲染系列(一)——平坦和线框着色(导数和几何体)

    因此,按逆时针方向给出三角形的顶点a ,b和c,其法线向量为n =(c-a)×(b-a)。通过归一化,可以得到最终的单位法向矢量。 ? ? (推导三角形的法线) 实际上,我们不需要使用三角形的顶点。...从一个空的void函数开始。 ? 仅当目标着色器模型为4.0或更高版本时才支持几何着色器。如果将目标定义得较低,Unity会自动将其增加到该级别,但让我们对其进行明确说明。...还需要声明我们正在处理的原始类型,在我们的例子中为三角形。必须在输入类型之前指定。另外,由于三角形每个都有三个顶点,因此我们正在研究三个结构的数组。必须明确定义它。 ?...因此,让使用My Lighting的任何人都可以通过CUSTOM_GEOMETRY_INTERPOLATORS宏定义通过几何着色器提供的自己的插值器数据。为此,将宏插入到插值器中。 ?...(smoothstep VS线性 过渡) Smoothstep函数具有三个参数a,b和c。前两个参数a和b定义了过渡应该覆盖的范围,而c是要平滑的值。这导致,在使用前将其钳位为0-1。 ? ? ?

    3.2K21
    领券