Yanıtlar:
Dizeleri birleştirdiğinizde, sonucu saklamak için bellek ayırmanız gerekir. Başlamak için en kolay String
ve &str
:
fn main() {
let mut owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
owned_string.push_str(borrowed_string);
println!("{}", owned_string);
}
Burada, değişebileceğimiz, sahip olduğumuz bir dizemiz var. Bu, bellek tahsisini tekrar kullanmamıza olanak tanıdığından etkilidir. Orada için de benzer durum String
ve String
gibi &String
olarak indirgenmedikleri edilebilir&str
.
fn main() {
let mut owned_string: String = "hello ".to_owned();
let another_owned_string: String = "world".to_owned();
owned_string.push_str(&another_owned_string);
println!("{}", owned_string);
}
Bundan sonra another_owned_string
, dokunulmaz ( mut
niteleyiciye dikkat edin ). Başka bir varyant var tüketirString
ama değişken olmasını gerektirmez. This is an uygulanması Add
özelliği bir alan String
sol tarafta hem de bir &str
sağ taraftaki olarak:
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let new_owned_string = owned_string + borrowed_string;
println!("{}", new_owned_string);
}
Şu numaraya owned_string
sesli arama yapıldıktan sonra erişilemediğini unutmayın:+
.
Ya her ikisine de dokunmadan yeni bir dize üretmek isteseydik? En basit yol kullanmaktır format!
:
fn main() {
let borrowed_string: &str = "hello ";
let another_borrowed_string: &str = "world";
let together = format!("{}{}", borrowed_string, another_borrowed_string);
println!("{}", together);
}
Her iki giriş değişkeninin değişmez olduğuna dikkat edin, bu yüzden bunlara dokunulmadığını biliyoruz. Herhangi bir kombinasyonu için aynı şeyi yapmak String
istersek, String
biçimlendirilebilecek gerçeği de kullanabiliriz:
fn main() {
let owned_string: String = "hello ".to_owned();
let another_owned_string: String = "world".to_owned();
let together = format!("{}{}", owned_string, another_owned_string);
println!("{}", together);
}
Sen yok olması kullanmak format!
gerçi. Sen olabilir tek bir dize klonlamak ve yeni bir dizeye diğer dize ekleyin:
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let together = owned_string.clone() + borrowed_string;
println!("{}", together);
}
Not - yaptığım tüm tip özellikleri gereksizdir - derleyici burada oyundaki tüm türleri çıkarabilir. Bu sorunun o grupta popüler olmasını beklediğim için onları Rust için yeni olan insanlara açık olması için ekledim!
Add
/ +
Sembolü hakkında ne düşünüyorsun ? Coverstersen onu kaplayabilirsin.
.to_owned()
ve impl .to_string()
uzmanlığı sayesinde yukarıdaki yorumdan bu yana düzeltildiğine dikkat edilmelidir . Her ikisi de a &str
. İlgili taahhüt: github.com/rust-lang/rust/pull/32586/files
Birden çok dizeyi, başka bir karakterle ayrılmış tek bir dizeye birleştirmek için birkaç yol vardır.
Gördüğüm en güzel join
yöntemi bir dizide kullanıyor:
fn main() {
let a = "Hello";
let b = "world";
let result = [a, b].join("\n");
print!("{}", result);
}
Kullanım durumunuza bağlı olarak daha fazla kontrol tercih edebilirsiniz:
fn main() {
let a = "Hello";
let b = "world";
let result = format!("{}\n{}", a, b);
print!("{}", result);
}
Gördüğüm birkaç manuel yol var, bazıları burada ve orada bir veya iki tahsis etmekten kaçınıyor. Okunabilirlik amacıyla yukarıdaki ikisinin yeterli olduğunu düşünüyorum.
join
aslında bağlı özellik . Özellik kararsız olarak işaretlenir, ancak yöntemleri stabildir ve Prelude'a dahil edilir, böylece varsayılan olarak her yerde kullanılabilirler. Takım, bu özelliğin var olması gerekmediğinin farkında gibi görünüyor ve gelecekte bununla birlikte bir şeyler değişeceğini hayal ediyorum. SliceContactExt
Bu concat
yöntemi düşünüyorum ve +
burada da belirtilmelidir:
assert_eq!(
("My".to_owned() + " " + "string"),
["My", " ", "string"].concat()
);
concat!
makro da var ama sadece değişmez değerler için:
let s = concat!("test", 10, 'b', true);
assert_eq!(s, "test10btrue");
+
mevcut bir cevapta zaten belirtilmiş . ( Bu bir uygulamasıdır Add
alır özelliği bir String
sol tarafı ve bir şekilde &str
sağ tarafı olarak: )
Dizeleri birleştirmek için RUST'da çeşitli yöntemler vardır
concat!()
):fn main() {
println!("{}", concat!("a", "b"))
}
Yukarıdaki kodun çıktısı:
ab
push_str()
ve +
operatörü kullanarak ):fn main() {
let mut _a = "a".to_string();
let _b = "b".to_string();
let _c = "c".to_string();
_a.push_str(&_b);
println!("{}", _a);
println!("{}", _a + &_b);
}
Yukarıdaki kodun çıktısı:
ab
ABC
Using format!()
):fn main() {
let mut _a = "a".to_string();
let _b = "b".to_string();
let _c = format!("{}{}", _a, _b);
println!("{}", _c);
}
Yukarıdaki kodun çıktısı:
ab
kontrol edin ve Rust oyun alanı ile deneme yapın
str
ve&str
olan farklı tip ve zamanın% 99 oranında, yalnızca önemsemeliyiz&str
. Aralarındaki farkları detaylandıran başka sorular da var.