我想把a的第一个字母大写&str.这是一个简单的问题,我希望有一个简单的解决方案.直觉告诉我做这样的事情:
let mut s = "foobar";
s[0] = s[0].to_uppercase();
Run Code Online (Sandbox Code Playgroud)
但是&strs不能像这样编入索引.我能够做到这一点的唯一方法似乎过于复杂.我将转换&str为迭代器,将迭代器转换为向量,大写为向量中的第一项,它创建了一个迭代器,我将其编入索引,创建一个Option,我打开它给我一个上面的首字母.然后我将矢量转换为迭代器,我将其转换为a String,我将其转换为a &str.
let s1 = "foobar";
let mut v: Vec<char> = s1.chars().collect();
v[0] = v[0].to_uppercase().nth(0).unwrap();
let s2: String = v.into_iter().collect();
let s3 = &s2;
Run Code Online (Sandbox Code Playgroud)
有没有比这更简单的方法,如果有,那又怎样?如果没有,为什么Rust以这种方式设计?
在这个答案中提到,对于一个字符串来说
s.chars().count(),获取字符数是一个O(n)操作.对于简单的ASCII字符串,也可以使用函数获取字节数s.len().当使用检查以确保所有这些字节实际上是ASCII时,这可能是安全的.
我想知道该操作的复杂程度.它可能仍然必须像在C中一样找到字符串的结尾并且是O(n).
我试图查找它并找到适用的文档std::string::Strings.然而,它并未说明其复杂性.看看它的来源就是这样做的self.vec.len().所以我们去看看矢量文档,发现这只是返回一个存储长度self.len,这意味着这确实是一个O(1)操作.
那是很多工作.现在来谈谈,此案s是一个的std ::海峡?我试图做同样的事情,但陷入了困境.
Rust中的操作复杂性是否有更容易访问的资源?
我尝试实现这个正则表达式来检查字符串 ( "username") 的长度是否在 3 到 30 之间,仅包含字母 (az)、数字 (0-9) 和句点 (.)(不连续):
use regex::Regex; // 1.3.5
fn main() {
Regex::new(r"^(?=.{3,30}$)(?!\.)(?!.*\.$)(?!.*?\.\.)[a-z0-9.]+$").unwrap();
}
Run Code Online (Sandbox Code Playgroud)
当尝试编译正则表达式时,我收到此错误:
use regex::Regex; // 1.3.5
fn main() {
Regex::new(r"^(?=.{3,30}$)(?!\.)(?!.*\.$)(?!.*?\.\.)[a-z0-9.]+$").unwrap();
}
Run Code Online (Sandbox Code Playgroud)
是否有替代的正则表达式或方法来根据这些要求验证字符串?
我可以按照建议删除长度{3,30}并获取字符串长度,但对于第二部分(?!\.)(?!.*\.$)(?!.*?\.\.)[a-z0-9.]+$(防止连续点)?
我尝试编写一些代码,从标准输入读取名称并打印出来。问题是在打印变量后立即换行,变量后面的字符打印在下一行:
use std::io;
fn main() {
println!("Enter your name:");
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed To read Input");
println!("Hello '{}'!", name);
}
Run Code Online (Sandbox Code Playgroud)
这 '!' 打印在下一行,这不是预期的位置。