假设变量c
中有一个char
,变量n
中有一个正的int
,我想构建包含c
的str
,c
出现n
次,我该怎么做呢?
我试着把它构建成一个String
,也许我只是在读字符串的文档时感到头晕,但是我不知道如何把它转换成一个str
。但是如果我试着直接把它构建成一个str
,我也不知道如何做。
对于context,下面是我尝试实现的完整函数:它获取一个字符串,并找到最长的连续字符序列(通过获取第一个出现的字符来打破平局)。
pub fn longest_sequence(s: &str) -> Option<&str> {
if s.len() == 0 { return None; }
let mut current_c = s.as_bytes()[0] as char;
let mut greatest_c = s.as_bytes()[0] as char;
let mut current_num = 0;
let mut greatest_num = 0;
for ch in s.chars() {
if current_c == ch {
current_num += 1;
if current_num > greatest_num {
greatest_num = current_num;
greatest_c = current_c;
}
} else {
current_num = 1;
current_c = ch;
}
}
// Now build the output str ...
}
2条答案
按热度按时间z4bn682m1#
我认为关于
str
和String
有一些误解。str
永远不会单独存在。它总是被用作&str
(或者Box<str>
或*str
,但在您的情况下,这些都不重要)。&str
不拥有任何数据。它只是对另一个String
(的一部分)的引用。String
实际上保存数据。String
;如果要引用现有数据,请返回&str
。String
转换为&str
。数据必须存储在某个地方,而&str
不存储它。(为了完整起见:是的,您可以泄漏它,但这将在内存中创建一个永久字符串,永远不会再消失)所以在你的情况下有两种方法:
&str
,因为它的数据已经存储在某处。String
。作为旁注:不要执行
s.as_bytes()[0] as char
,因为它不适用于UTF8字符串。Rust字符串被定义为UTF8。以下是一个可能的解决方案:
第一个
一些解释:
s.chars().next()?
会自动执行此操作。s.chars().next()
而不是s.as_bytes()[0] as char
,因为第二个不兼容UTF8。greatest_len
而不是使用greatest.len()
,因为greatest.len()
也不兼容UTF8,因为它以字节为单位提供字符串的大小,而不是以字符为单位。&s[current_start..current_start+current_len]
将不起作用,因为&s[ .. ]
希望索引在bytes中,但current_len
在chars中。所以我们需要等待另一个char来知道前一个char的结尾。根据您的代码,另一个解决方案是:
第一次
7kqas0il2#
要将
String
转换为&'static str
,需要如下泄漏:以及
char
至String
:所以
char
到&'static str
基本上看起来像这样:我不建议泄漏的
String
tho,只是使用它是。