nasıl türleri aşağıdaki kombinasyonları ard arda:Dizeleri nasıl birleştiririm?
str
vestr
String
vestr
String
ve
nasıl türleri aşağıdaki kombinasyonları ard arda:Dizeleri nasıl birleştiririm?
str
ve str
String
ve str
String
vedizeleri bitiştirmek String
yapmanız bellek ayırması gerekir sonucu sakla. ile başlayan en kolay String
ve &str
: İşte
fn main() {
let mut owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
owned_string.push_str(borrowed_string);
println!("{}", owned_string);
}
, biz bir sahibi dize mutasyona olabilir ki. Bu, potansiyel olarak bellek ayırmayı yeniden kullanmamıza izin verdiği için etkilidir. String
ve String
için &String
can be dereferenced as &str
olarak benzer bir durum var. Bundan sonra
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);
}
, another_owned_string
(hayır mut
eleme dikkat edin) bakir. 'un'un String
'u tükettiği başka bir varyantı vardır, ancak bunun değişebilir olmasını gerektirmez. Bu sol tarafı olarak bir String
ve sağ tarafı olarak bir &str
götüren bir implementation of the Add
trait geçerli: owned_string
artık erişilebilir +
çağrısının sonradır
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);
}
Not söyledi.
Yeni bir dize üretmek istediğimizde, her ikisi de el değmemiş mi? Her iki giriş değişkenleri iletmenin
fn main() {
let borrowed_string: &str = "hello ";
let another_borrowed_string: &str = "world";
let together = format!("{}{}", borrowed_string, another_borrowed_string);
println!("{}", together);
}
Not, bu yüzden onlar dokundu olmadığını biliyoruz: En basit yolu format!
kullanmaktır. gerçi format!
kullanmak
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 yok: Biz String
herhangi bir kombinasyonu için aynı şeyi yapmak isteseydik String
de biçimlendirilebilir gerçeğini kullanabilirsiniz. Yaptığım tip şartnamenin tüm gereksiz olduğunu - - derleyici burada oyundaki her türlü çıkarabiliriz
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let together = owned_string.clone() + borrowed_string;
println!("{}", together);
}
Not: Sen clone one string ve yeni bir dizeye diğer dize ekleyebilirsiniz. Bu soruyu bu grupta popüler olmasını beklediğimden, onlara sadece Rust'a yeni olanları açıklamak için ekledim!
Bir & str'niz varsa, 'to_owned()' 'to_string()' yerine tercih edilmelidir; std :: fmt 'altyapısını atlayarak daha verimli. –
@ChrisMorgan kesinlikle doğru, ama ben özellikle bu yüksek görüş-sayısı yeni başlayan bir soru olarak beklediğimden, 'to_string' burada hemen daha anlaşılabilir olduğunu düşündüm. Kendi kendime '_ ^' yi tercih ederim. – Shepmaster
'Add' /' + 'sembolü hakkında ne düşünüyorsunuz? İstersen onu koruyabilirsin. – bluss
Birden çok dizeyi başka bir karakterle ayrılmış tek bir dizeye birleştirmek için birkaç yol vardır.
Bir dizi join
yöntemi kullanıyor gördüğüm en güzel:
fn main() {
let a = "Hello";
let b = "world";
let result = [a, b].join("\n");
print!("{}", result);
}
kullanımı durumda bağlı olarak da daha fazla kontrol tercih edebilirsiniz:
fn main() {
let a = "Hello";
let b = "world";
let result = format!("{}\n{}", a, b);
print!("{}", result);
}
biraz daha manuel yolları vardır Gördünüz mü, burada bir ya da iki tahsisten kaçınıyorum. Okunabilirlik amaçları için, yukarıdaki iki taneyi yeterli buluyorum.
'join' belgelendirilmiş nerede? Bir Dizi ve bir String arasında yarımca oturur. [Dizi] (https://doc.rust-lang.org/std/primitive.array.html) belgelerini araştırdım ve hızla karıştı. –
@DuaneJ 'join' aslında [' SliceContactExt' özelliği] 'ne eklenmiştir (https://doc.rust-lang.org/std/slice/trait.SliceConcatExt.html). Bu özellik kararsız olarak işaretlenmiştir, ancak yöntemleri kararlı ve [Prelude] 'de yer almaktadır. (Https://doc.rust-lang.org/std/prelude/#prelude-contents) bu nedenle heryerde varsayılan olarak kullanılabilirler. Ekip, bu özelliğin var olmasının gerekmediğini iyi biliyor ve gelecekte onunla birlikte değişeceklerini hayal ediyorum. –
'str' ve' str' * farklı tip * olduğunu ve zamanın% 99'unu unutmayın, sadece 'str' ile ilgilenmelisiniz. Aralarındaki farkları detaylandıran başka sorular var. – Shepmaster