我有一个字符串,我需要扫描每次出现的"foo"并读取其后的所有文本,直到一秒钟".由于Rust没有,我需要通过字符扫描来迭代它.我该怎么做?contains字符串函数
编辑:Rust &str有一个contains()和find()方法.
在Python中,这将是final_char = mystring[-1].我怎么能在Rust做同样的事情?
我试过了
mystring[mystring.len() - 1]
Run Code Online (Sandbox Code Playgroud)
但我得到了错误 the type 'str' cannot be indexed by 'usize'
我是 Rust 的新手,并试图了解我们什么时候应该使用 unwrap 和 expect。
这是一个示例代码:
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
let query = args.get(1).unwrap();
println!("query from unwrawp: {}", query);
let query = args.get(1).expect("insufficient arguments");
println!("query from expect: {}", query);
//$ cargo run hello
//OUTPUT:
//query from expect: hello
//query from unwrawp: hello
}
Run Code Online (Sandbox Code Playgroud)
我观察到的唯一区别是期望中有一个自定义的恐慌消息。
这两者是否可以互换,或者是否有任何特殊情况我们应该使用一种而不是另一种?
我有一段我正在使用的代码,我在另一个Stack Overflow问题中找到了
fn is_palindromic(num: i64) -> bool {
let string = num.to_string();
let bytes = string.as_bytes();
let iter = bytes.iter();
let n = bytes.len() / 2;
equals(iter.take(n), iter.rev().take(n))
}
Run Code Online (Sandbox Code Playgroud)
当我最初找到它时这很好用,但是在2015年1月30日和2012年2月17日之间的Rust nightlies中发生了一些变化,导致弹出这个新错误:
src/program.rs:8:26: 8:30 error: use of moved value: `iter`
src/program.rs:8 equals(iter.take(n), iter.rev().take(n))
^~~~
src/program.rs:8:12: 8:16 note: `iter` moved here because it has type `core::slice::Iter<'_, u8>`, which is non-copyable
src/program.rs:8 equals(iter.take(n), iter.rev().take(n))
^~~~
Run Code Online (Sandbox Code Playgroud)
我查看了文档,但我似乎无法找到任何可能表明可能发生变化的内容.看起来这个take方法现在的行为可能有所不同,但我不确定如何解决克隆bytes和使用两个单独的迭代器之间的情况.
这似乎是一种解决看似非常常见问题的非常低效的方法,所以我想我可能会遗漏一些东西.
借用迭代器以使用类似方法的正确方法是std::iter::order::equals什么?
我原来的做法:
pub fn find_the_difference(s: String, t: String) -> char {
let mut c:u8 = 0;
for i in 0..s.chars().count() {
c ^= t.chars().nth(i).unwrap() as u8 ^ s.chars().nth(i).unwrap() as u8;
}
return (c ^ t.chars().nth(s.chars().count()).unwrap() as u8) as char;
}
Run Code Online (Sandbox Code Playgroud)
但它太慢了,而且我必须编写替换的所有内容都非常疯狂t[i] ^ s[i](请参阅下面的原始 C++ 函数)。所以我寻找其他东西,发现了这个方法,我们将字符串转换为字符数组,并得到了一些好的结果(从 8 毫秒到 0 毫秒)。
pub fn find_the_difference(s1: String, t1: String) -> char {
let mut c:u8 = 0;
let s: Vec<char> = s1.chars().collect();
let t: Vec<char> = t1.chars().collect();
for i in 0..s1.chars().count() …Run Code Online (Sandbox Code Playgroud)