dyn Trait
ΠΠΎΠΌΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅ΠΉΡΠΎΠ² Π΄Π»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΡ, Rust ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΈΡ Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎ ΡΡΡΡΡΡΠΌ ΡΠΈΠΏΠΎΠΌ ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠ΅ΠΉΡΠΎΠ²:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
struct Dog {
name: String,
age: i8,
}
struct Cat {
lives: i8,
}
trait Pet {
fn talk(&self) -> String;
}
impl Pet for Dog {
fn talk(&self) -> String {
format!("Woof, my name is {}!", self.name)
}
}
impl Pet for Cat {
fn talk(&self) -> String {
String::from("Miau!")
}
}
// ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ.
fn generic(pet: &impl Pet) {
println!("Hello, who are you? {}", pet.talk());
}
// ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ.
fn dynamic(pet: &dyn Pet) {
println!("Hello, who are you? {}", pet.talk());
}
fn main() {
let cat = Cat { lives: 9 };
let dog = Dog { name: String::from("Fido"), age: 5 };
generic(&cat);
generic(&dog);
dynamic(&cat);
dynamic(&dog);
}
-
ΠΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅
impl Trait, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΌΠΎΠ½ΠΎΠΌΠΎΡΡΠΈΠ·Π°ΡΠΈΡ: ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° ΡΡΠ΅ΠΉΡΠ° ΠΈΠ· ΠΎΠ±ΠΎΠ±ΡΡΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ ΠΏΠΎΠ»Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠΏΠ΅ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ Π½ΡΠΆΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ΅ΠΉΡΠ°. -
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ
dyn TraitΠ²ΡΠ·ΠΎΠ²Ρ ΠΈΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² (vtable). ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡfn dynamic, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠΈΠΏPetΠΏΠ΅ΡΠ΅Π΄Π°Π½. -
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ
dyn TraitΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ΅ΠΉΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π·Π° ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ Π²ΠΈΠ΄ΠΎΠΌ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΡΡΡΠ»ΠΊΠ°, Ρ ΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΡΠΈΠΏΡ ΡΠΌΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅ΡBox(ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΡΠ΅ΡΠΈΠΉ Π΄Π΅Π½Ρ). -
ΠΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
&dyn PetΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΊΠ°ΠΊ Β«ΡΠΎΠ»ΡΡΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΒ» (fat pointer), ΡΠΎ Π΅ΡΡΡ ΠΏΠ°ΡΠ° ΠΈΠ· Π΄Π²ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ: ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉPet, Π° Π΄ΡΡΠ³ΠΎΠΉ β Π½Π° vtable ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ΅ΠΉΡΠ° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΌΠ΅ΡΠΎΠ΄Π°talkΡ&dyn PetΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡtalkΠ² vtable ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π² Π½Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π°DogΠΈΠ»ΠΈCat. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΏPet, ΡΡΠΎΠ±Ρ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ. -
Π’ΠΈΠΏ
dyn TraitΡΡΠΈΡΠ°Π΅ΡΡΡ Β«ΡΡΡΡΡΡΠΌ ΠΏΠΎ ΡΠΈΠΏΡΒ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π½Π°Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Ρ Π·Π½Π°Π½ΠΈΡ ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠΈΠΏΠ΅ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.