Why the code looks so long while writing with Rust? With the same function writing in Kotlin , it seems so easy to read and write. I think that I might be wrong with this program. What's wrong with this??
Rust version
struct Life {
is_dead: bool,
}
impl Life {
fn new() -> Life {
Life {
is_dead: false
}
}
fn is_alive(&self) -> bool {
return !self.is_dead;
}
fn die_now(&self) -> Life {
return Life {
is_dead: true,
}
}
}
trait Fittable {
fn fit(&self);
}
trait Yelled {
fn yell(&self);
}
struct Cat {
life: Life,
}
impl Fittable for Cat {
fn fit(&self) {
if self.life.is_alive() {
println!("Fish");
} else {
println!("You cannot fit a dead cat");
}
}
}
impl Yelled for Cat {
fn yell(&self) {
if self.life.is_alive() {
println!("Meow");
} else {
println!("A dead cat cannot yell");
}
}
}
impl Cat {
fn new() -> Cat {
Cat {
life: Life::new()
}
}
fn die_now(&self) -> Cat {
Cat {
life: self.life.die_now(),
..*self
}
}
}
struct Dog {
life: Life,
}
impl Fittable for Dog {
fn fit(&self) {
if self.life.is_alive() {
println!("Bone");
} else {
println!("You cannot fit a dead dog");
}
}
}
impl Yelled for Dog {
fn yell(&self) {
if self.life.is_alive() {
println!("Woof");
} else {
println!("A dead dog cannot yell");
}
}
}
impl Dog {
fn new() -> Dog {
Dog {
life: Life::new()
}
}
fn die_now(&self) -> Dog {
Dog {
life: self.life.die_now(),
..*self
}
}
}
fn main() {
let cat = Cat::new();
println!("cat is alive? {}", cat.life.is_alive());
cat.fit();
cat.yell();
let cat = cat.die_now();
println!("cat is alive? {}", cat.life.is_alive());
cat.fit();
cat.yell();
let dog = Dog::new();
println!("dog is alive? {}", dog.life.is_alive());
dog.fit();
dog.yell();
let dog = dog.die_now();
println!("dog is alive? {}", dog.life.is_alive());
dog.fit();
dog.yell();
}
Kotlin Version:
abstract class Life {
private var isDead = false;
fun isAlive(): Boolean {
return !this.isDead;
}
fun dieNow() {
this.isDead = true;
}
}
interface Fittable {
fun fit();
}
interface Yelled {
fun yell();
}
class Cat: Life, Fittable, Yelled {
constructor()
override fun fit() {
if (this.isAlive()) {
println("Fish");
} else {
println("You cannot fit a dead cat");
}
}
override fun yell() {
if (this.isAlive()) {
println("Meow");
} else {
println("A dead cat cannot yell");
}
}
}
class Dog: Life, Fittable, Yelled {
constructor()
override fun fit() {
if (this.isAlive()) {
println("Bone");
} else {
println("You cannot fit a dead dog");
}
}
override fun yell() {
if (this.isAlive()) {
println("Woof");
} else {
println("A dead dog cannot yell");
}
}
}
fun main() {
val cat = Cat();
println("cat is alive? ${cat.isAlive()}");
cat.fit();
cat.yell();
cat.dieNow();
println("cat is alive? ${cat.isAlive()}");
cat.fit();
cat.yell();
val dog = Dog();
println("dog is alive? ${dog.isAlive()}");
dog.fit();
dog.yell();
dog.dieNow();
println("dog is alive? ${dog.isAlive()}");
dog.fit();
dog.yell();
}