50 lines
1.0 KiB
V
50 lines
1.0 KiB
V
|
module main
|
||
|
|
||
|
interface Speaker {
|
||
|
say() string
|
||
|
}
|
||
|
|
||
|
struct ChatRoom {
|
||
|
mut:
|
||
|
talkers map[string]Speaker
|
||
|
}
|
||
|
|
||
|
fn new_room() &ChatRoom {
|
||
|
return &ChatRoom{
|
||
|
talkers: map[string]Speaker
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn (r mut ChatRoom) add(name string, s Speaker) {
|
||
|
r.talkers[name] = s
|
||
|
}
|
||
|
|
||
|
fn test_using_a_map_of_speaker_interfaces(){
|
||
|
mut room := new_room()
|
||
|
room.add('my cat', Cat{name: 'Tigga'} )
|
||
|
room.add('my dog', Dog{name: 'Pirin'} )
|
||
|
room.add('stray dog', Dog{name: 'Anoni'} )
|
||
|
room.add('me', Human{name: 'Bilbo'} )
|
||
|
room.add('she', Human{name: 'Maria'} )
|
||
|
mut text := ''
|
||
|
for name, subject in room.talkers {
|
||
|
line := '${name:12s}: ${subject.say()}'
|
||
|
println(line)
|
||
|
text += line
|
||
|
}
|
||
|
assert text.contains(' meows ')
|
||
|
assert text.contains(' barks ')
|
||
|
assert text.contains(' says ')
|
||
|
}
|
||
|
|
||
|
//
|
||
|
|
||
|
struct Cat { name string }
|
||
|
fn (c &Cat) say() string { return '${c.name} meows "MEOW!"' }
|
||
|
|
||
|
struct Dog { name string }
|
||
|
fn (d &Dog) say() string { return '${d.name} barks "Bau Bau!"' }
|
||
|
|
||
|
struct Human { name string }
|
||
|
fn (h &Human) say() string { return '${h.name} says "Hello"' }
|