- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Rust 非常非常陌生,并尝试实现一些简单的东西来感受这门语言。现在,我遇到了实现类结构的最佳方法,该结构涉及将字符串转换为 int。我正在使用一个全局命名空间函数,这对我沉迷于 Ruby 的大脑来说是错误的。
这样做的乡村方式是什么?
use std::io;
struct Person {
name: ~str,
age: int
}
impl Person {
fn new(input_name: ~str) -> Person {
Person {
name: input_name,
age: get_int_from_input(~"Please enter a number for age.")
}
}
fn print_info(&self) {
println(fmt!("%s is %i years old.", self.name, self.age));
}
}
fn get_int_from_input(prompt_message: ~str) -> int {
println(prompt_message);
let my_input = io::stdin().read_line();
let my_val =
match from_str::<int>(my_input) {
Some(number_string) => number_string,
_ => fail!("got to put in a number.")
};
return my_val;
}
fn main() {
let first_person = Person::new(~"Ohai");
first_person.print_info();
}
最佳答案
这是我的代码版本,我做得更惯用了:
use std::io;
struct Person {
name: ~str,
age: int
}
impl Person {
fn print_info(&self) {
println!("{} is {} years old.", self.name, self.age);
}
}
fn get_int_from_input(prompt_message: &str) -> int {
println(prompt_message);
let my_input = io::stdin().read_line();
from_str::<int>(my_input).expect("got to put in a number.")
}
fn main() {
let first_person = Person {
name: ~"Ohai",
age: get_int_from_input("Please enter a number for age.")
};
first_person.print_info();
}
fmt!
/
format!
fmt!
宏,带有
printf
- 基于语法,支持
format!
, 它使用类似于
Python format strings 的语法.新版本 Rust 0.9 会提示使用
fmt!
.因此,您应该替换
fmt!("%s is %i years old.", self.name, self.age)
与
format!("{} is {} years old.", self.name, self.age)
.但是,我们有一个方便的宏
println!(...)
这意味着与
println(format!(...))
完全相同的东西, 所以用 Rust 编写代码最惯用的方法是
println!("{} is {} years old.", self.name, self.age);
Person
这样的简单类型,在 Rust 中,使用 struct 字面量语法创建类型的实例是惯用的:
let first_person = Person {
name: ~"Ohai",
age: get_int_from_input("Please enter a number for age.")
};
Person::new
是类型
Person
的“默认”构造函数(我的意思是最常用的构造函数)的惯用名称。 .但是,默认构造函数要求用户输入进行初始化似乎很奇怪。通常,我认为您会有
person
模块,例如(带有
person::Person
由模块导出)。在这种情况下,我认为使用模块级函数
fn person::prompt_for_age(name: ~str) -> person::Person
是最惯用的。 .或者,您可以在
Person
上使用静态方法--
Person::prompt_for_age(name: ~str)
.
&str
与
~str
在函数参数中
get_int_from_input
的签名采取
&str
而不是
~str
.
~str
表示在交换堆上分配的字符串——换句话说,
malloc
的堆/
free
在 C 中,或
new
/
delete
在 C++ 上进行操作。然而,与 C/C++ 不同的是,Rust 强制要求交换堆上的值一次只能由一个变量拥有。因此,采取
~str
作为函数参数意味着函数的调用者不能重用
~str
它传入的参数——它必须复制
~str
使用
.clone
方法。
&str
是字符串中的一个切片,它只是对字符串中一系列字符的引用,因此当函数使用
&str
时,不需要分配字符串的新副本。参数被调用。
&str
而不是
~str
对于
prompt_message
在
get_int_from_input
是函数不需要在函数结束后保留消息。它仅使用提示消息来打印它(
println
采用
&str
,而不是
~str
)。一旦您将函数更改为
&str
, 你可以这样称呼它
get_int_from_input("Prompt")
而不是
get_int_from_input(~"Prompt")
,从而避免了
"Prompt"
的不必要分配在堆上(同样,您可以避免在下面的代码中克隆
s
):
let s: ~str = ~"Prompt";
let i = get_int_from_input(s.clone());
println(s); // Would complain that `s` is no longer valid without cloning it above
// if `get_int_from_input` takes `~str`, but not if it takes `&str`.
Option<T>::expect
Option<T>::expect
方法是您拥有的 match 语句的惯用快捷方式,您希望在其中返回
x
如果你得到
Some(x)
如果您收到
None
,则失败并显示一条消息.
return
return
的情况下返回值是惯用的(以 Haskell 和 OCaml 等函数式语言为例)。陈述。实际上,函数的返回值是函数中最后一个表达式的结果,除非该表达式后跟一个分号(在这种情况下它返回
()
,也就是单位,它本质上是一个空的占位符值——
()
也是没有明确返回类型的函数返回的内容,例如
main
或
print_info
)。
关于closures - 在 Rust 中使用标准输入数据实例化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20861217/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!