You can always override the default by writing your own method.
Traits with default methods make your code flexible and easier to maintain.
Summary
Default method implementations provide reusable behavior in traits.
Types can use the default or override it with their own method.
This feature keeps code clean and reduces repetition.
Practice
(1/5)
1. What is the main purpose of default method implementations in Rust traits?
easy
A. To automatically generate structs from traits
B. To force all types to implement the method themselves
C. To prevent any method from being used outside the trait
D. To provide reusable behavior that types can use or override
Solution
Step 1: Understand trait default methods
Default methods in traits provide a common implementation that types can use without writing their own code.
Step 2: Compare with other options
Options A, B, and C describe behaviors that are not true for default methods in Rust traits.
Final Answer:
To provide reusable behavior that types can use or override -> Option D
Quick Check:
Default methods = reusable behavior [OK]
Hint: Default methods give ready code to reuse or replace [OK]
Common Mistakes:
Thinking default methods force implementation
Confusing traits with structs
Believing default methods hide methods
2. Which of the following is the correct syntax to define a default method in a Rust trait?
easy
A. fn greet() { println!("Hello"); }
B. fn greet();
C. fn greet() -> { println!("Hello"); }
D. fn greet() => println!("Hello");
Solution
Step 1: Recall Rust trait method syntax
Default methods in traits have a body with curly braces, like fn greet() { ... }.
Step 2: Check each option
fn greet() { println!("Hello"); } uses correct syntax with braces. fn greet(); is a method signature without body (no default). Options A and D have invalid syntax.
Final Answer:
fn greet() { println!("Hello"); } -> Option A
Quick Check:
Default method = fn name() { body } [OK]
Hint: Default methods always have braces with code inside [OK]
Common Mistakes:
Omitting braces for default methods
Using arrow syntax instead of braces
Writing only method signatures without body
3. What will be the output of this Rust code?
trait Speak {
fn say(&self) {
println!("Default speaking");
}
}
struct Dog;
impl Speak for Dog {}
fn main() {
let d = Dog;
d.say();
}
medium
A. Dog says woof
B. Compilation error: method say not implemented
C. Default speaking
D. No output
Solution
Step 1: Analyze trait and struct implementation
The trait Speak has a default method say that prints "Default speaking". Dog implements Speak but does not override say.
Step 2: Determine method called
Since Dog does not override say, calling d.say() uses the default method from the trait.
Final Answer:
Default speaking -> Option C
Quick Check:
Default method runs if not overridden [OK]
Hint: If no override, default method runs [OK]
Common Mistakes:
Expecting an error for missing method
Assuming default method is not used
Confusing struct behavior with trait methods
4. Identify the error in this Rust code using default method implementations:
trait Talk {
fn talk(&self) {
println!("Talking");
}
}
struct Cat;
impl Talk for Cat {
fn talk(&self);
}
fn main() {
let c = Cat;
c.talk();
}
medium
A. Trait Talk must not have default methods
B. Missing method body in impl causes compilation error
C. Struct Cat cannot implement Talk
D. No error, code runs fine
Solution
Step 1: Check impl block for talk method
The impl for Cat declares fn talk(&self); without a body, which is invalid syntax in Rust.
Step 2: Understand default method usage
Since Talk trait has a default talk method, Cat can omit implementing it or provide a full method body. Declaring without body causes error.
Final Answer:
Missing method body in impl causes compilation error -> Option B
Quick Check:
Impl methods need bodies unless default used [OK]
Hint: Impl methods must have bodies or be omitted [OK]
Common Mistakes:
Declaring method without body in impl
Thinking default method forces impl
Ignoring compiler error messages
5. Given this trait and structs, how can you override the default method only for Cat while Dog uses the default?
trait Animal {
fn sound(&self) {
println!("Some sound");
}
}
struct Dog;
struct Cat;
impl Animal for Dog {}
impl Animal for Cat {
// What goes here?
}
fn main() {
let dog = Dog;
dog.sound();
let cat = Cat;
cat.sound();
}
hard
A. fn sound(&self) { println!("Meow"); }
B. fn sound(&self);
C. fn sound() { println!("Meow"); }
D. fn sound(&self) -> String { "Meow".to_string() }
Solution
Step 1: Understand overriding default methods
To override a default method, provide a method with the same signature and a body in the impl block.