g-var.com | G-VAR's Blog

Recent Posts

Full Tag Index

Posts in “Rust”

Rust 1.2.2 | Display

Thu, Jul 6, 2017
转载请注明出处! 译文链接:Rust 1.2.2 | Display 英文原文:Display fmt::Debug看起来几乎是既不紧凑也不整洁,但通常利于进行输出形式的定制。而通过手动实现fmt::Display是可以实现紧凑又整洁的,其使用了{}输出标记。实现形式如下: // (通过`use`)导入`fmt`模块来使其可见 use std::fmt; // 定义一个用于实现`fmt::Display`的结构体,只是一个简单tuple struct, // 包含一个绑定到名称为`Structure`结构体`i32`类型数据 struct Structure(i32); // 为了使用`{}`标记,必须为此类型手动实现`fmt::Display`特性 impl fmt::Display for Structure { // 此特性需要`fmt`的确切签名 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // 直接将第一个元素写入提供的输出流:`f`中, // 返回一个`fmt::Result`,其表示了是否操作成功, // 注意`write!`的语法与`println!`类似。 write!(f, "{}", self.0) } } fmt::Display可能会比fmt::Debug更整洁,但这暴露了std库的一个问题。模糊类型该如何显示?例如,如果std库为所有的Vec<T>实现了一个单一类型,那么该是何种风格?下面两种的一种? Vec<path>:/:/etc:/home/username:/bin(以:分割) Vec<number>:1,2,3(以,分割) 都不是,因为所有的类型都没有实际的风格,并且std库也不会假定一个。Vec<T>或者其它通用容器并没有实现fmt::Display。这些通用情况会使用fmt::Debug。 这并不是个问题,因为任何新的容器类型都不是通用的,可以实现fmt::Display。 use std::fmt; // 导入`fmt` // 拥有两个数的结构体。继承了`Debug`,来与`Display`进行对比 #[derive(Debug)] struct MinMax(i64, i64); // 为`MinMax`实现`Display` impl fmt::Display for MinMax { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // 使用`self.

Rust 1.2.1 | Debug

Tue, Aug 4, 2015
转载请注明出处! 译文链接:Rust 1.2.1 | Debug 英文原文:Debug 所有想使用std::fmt格式化traits的类型均需要具有可打印输出的实现。只有在std库中的一些类型自动实现了这个特性。而其它类型就需要手动实现了。 fmt::Debug特性将此工作变得非常直接。所有类型均可以derive(自动创建)fmt::Debug实现。而对于fmt::Display不一定可行,其需要手动实现。 // 此结构体不可以被打印输出,因为其既不具有`fmt::Display`也不具有`fmt::Debug` struct UnPrintable(i32); // `derive`会为具有`fmt::Debug`属性的`struct`自动创建相关实现 #[derive(Debug)] struct DebugPrintable(i32); 所有std库中的类型也都可以通过{:?}自动实现打印输出功能: // 为`Structure`继承`fmt::Debug`实现.`Structure`是只包含了一个`i32`类型成员 #[derive(Debug)] struct Structure(i32); // 将`Structure`放入`Deep`结构体中.也使其具有打印输出功能. #[derive(Debug)] struct Deep(Structure); fn main() { // 使用`{:?}`进行打印与`{}`类似 println!("{:?} months in a year.", 12); println!("{1:?} {0:?} is the {actor:?} name.", "Slater", "Christian", actor="actor's"); // `Structure`是可打印输出的! println!("Now {:?} will print!", Structure(3)); // 使用`derive`的一个问题是对显示结果不可控.如果只想显示一个`7`该怎么办? println!("Now {:?} will print!", Deep(Structure(7))); } 虽然fmt::Debug可以直接实现打印功能,但会损失一些优雅的特性。而通过手动实现fmt::Display是可以解决该问题的。 请参考: attributes, derive, std::fmt, 以及 struct

Rust 1.2| 格式化输出

Tue, Jul 28, 2015
转载请注明出处! 译文链接:Rust 1.2 | 格式化输出 英文原文:Formatted print 打印输出是由一系列的宏来进行处理的,这些宏包含在std::fmt标准库中。其中包含下面三种形式: format!:将格式化的文本写入字符串中 print!:功能与format!相同,但文本是被输出到控制台 println!:功能与print!相同,但会在一行的末尾追加换行符 所有的文本均以相同的形式进行解析。另外一点就是会在编译期检验文本格式的正确性。 fn main() { // 通常情况下,`{}`会自动替换任意参数,并且会将替换的内容字符串化。 println!("{} days", 31); // 此处31未带有后缀,31默认是i32类型。也可以通过添加后缀来改变31的类型。 // 显示的形式是有不同的可选样式的。 // 可以使用位置参数。 println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob"); // 也可以使用命名参数。 println!("{subject} {verb} {predicate}", predicate="over the lazy dog", subject="the quick brown fox", verb="jumps"); // 可以在`:`字符之后指定特殊的格式。 println!("{} of {:b} people know binary, the other half don't", 1, 2); // 编译器甚至会进行检验,以确保使用正确的参数个数。 // 下面的语句编译出错。 println!

Rust 1.1| 注释

Sun, Jul 26, 2015
转载请注明出处! 译文链接:Rust 1.1 | 注释 英文原文:Comments 任何程序都需要注释,并且实际上Rust中支持几种不同的注释形式: 常规注释会被编译器忽略掉: // 行注释,一直到行的末尾。 /* 块注释,一直到结束分隔符。*/ 文档注释会被解析成HTML形式的库文档: /// 为后面的内容生成库文档。 //! 将包含的内容生成库文档。 例子: fn main() { // This is an example of a line comment // Notice how there are two slashes at the beginning of the line // And that nothing written inside these will be read by the compiler // println!("Hello, world!"); // Run it. See? Now try deleting the two slashes, and run it again.

Rust 1 | Hello World

Thu, Jul 23, 2015
转载请注明出处! 译文链接:Rust 1 | Hello World 英文原文:Hello World 下面是传统Hello World程序的源码。 // 此处为注释,编译器会忽略这些内容。 // 下面为main函数 fn main() { // 当编译出来的可执行文件被调用时会执行此处的语句。 // 将文字打印输出 println!("Hello World!"); } println!是一个宏,用来将文字打印输出。 使用Rust编译器:rustc来生成可执行文件。 $ rustc hello.rs rustc会生成一个名字为hello的可执行文件。 $ ./hello Hello World! [ 转载必须在正文中标注并保留原文链接、译文链接等信息。]

Rust 0 | 介绍

Thu, Jul 23, 2015
最近开始学习Rust语言,看到Rust官网上有个分类为Rust by Example,里面都是用Rust语言写的例子,感觉可以通过这些例子来学习Rust了,因此我要将该分类下的内容翻译过来,一方面加深自己的理解与学习,一方面留作以后检查之用。 翻译的过程并没有完全照搬原文,有时可能会加入自己的理解,并且部分注释内容没有进行翻译工作,仅供自学使用,更多内容请参考官方文档。