12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #!/usr/bin/ruby
- #
- ## Translation of: https://en.wikipedia.org/wiki/Multiple_dispatch#Perl_6
- #
- class StellarObject(Number mass) {
- method <=>(StellarObject arg) {
- self.mass <=> arg.mass;
- }
- method >(StellarObject arg) {
- self.mass > arg.mass
- }
- method <(StellarObject arg) {
- self.mass < arg.mass
- }
- }
- class Asteroid < StellarObject {
- has name = 'an asteroid'
- }
- class Spaceship(name='some unnamed spaceship') < StellarObject {
- }
- var destroyed = < obliterated destroyed mangled >;
- var damaged = ['damaged', 'collided with', 'was damaged by'];
- func collide(Asteroid a, Asteroid b) {
- say "two asteroids collided and combined into one larger asteroid of mass #{ a.mass + b.mass }";
- }
- func collide(a, b) {
- if (a > b) {
- collide(b, a)
- }
- elsif (a < b) {
- say "#{a.name} was #{destroyed.pick} by #{b.name}";
- }
- else {
- if (a.kind_of(Spaceship) && b.kind_of(Spaceship) && (a.mass == b.mass)) {
- var (n1, n2) = [a.name, b.name].shuffle...;
- say "#{n1} collided with #{n2}, and both ships were #{[destroyed.pick, 'left damaged'].pick}";
- }
- else {
- var (n1, n2) = [a.name, b.name].shuffle...;
- say "#{n1} #{damaged.pick} #{n2}";
- }
- }
- }
- var Enterprise = Spaceship(mass: 1, name: 'The Enterprise');
- collide(Asteroid(mass: 1), Enterprise);
- collide(Enterprise, Spaceship(mass: .1));
- collide(Enterprise, Asteroid(mass: 1));
- collide(Enterprise, Spaceship(mass: 1));
- collide(Asteroid(mass: 10), Asteroid(mass: 5));
|