2013年9月23日月曜日

開発環境

『続・初めてのPerl 改訂版』(Randal L. Schwartz, brian d foy, Tom Phoenix 著、伊藤 直也田中 慎司吉川 英興 監訳、株式会社ロングテール/長尾 高弘 訳、オライリー・ジャパン、2006年、ISBN4-87311-305-9)の13章(オブジェクトのデストラクション)の13.8(練習問題)1を解いてみる。

その他参考書籍

1.

コード(BBEdit)

sample.pl

#!/usr/bin/env perl
use strict;
use warnings;
use 5.016;
use utf8;
binmode STDOUT, ':utf8';
binmode STDIN, ':utf8';
binmode STDERR, ':utf8';

{ package LivingCreature;
  sub speak {
      my $either = shift;
      if (@_) {
          say "a $either goes '@_'";
      } else {
          say "a $either goes ", $either->sound, "!";
      }
  }
}

{ package Animal;
  use Carp qw(croak);
  our @ISA = qw(LivingCreature);
  sub new {
      ref(my $class = shift) and croak "class name needed";
      my $name = shift;
      my $self = {Name => $name, Color => $class->default_color};
      bless $self, $class;
  }
  sub default_color{ 'brown' }
  sub set_name {
      ref(my $self = shift) or croak "instance variable(name) needed";
      $self->{Name} = shift;
  }
  sub name {
      my $either = shift;
      ref $either
          ? $either->{Name}
          : "an unnamed $either";
  }
  sub set_color {
      ref(my $self = shift) or croak "instance variable(color) needed";
      $self->{Color} = shift;
  }
  sub color {
      my $either = shift;
      ref $either
          ? $either->{Color}
          : $either->default_color;
  }
  sub sound {
      croak '動物のsoundが定義されていない!';
  }
  sub speak {
     my $either = shift;
     if (@_) {
         croak "ドリトル博士ではないので、動物と話はできません!" if @_;
     } else {
         $either->SUPER::speak;
     }
 }
}

{ package Horse;
  our @ISA = qw(Animal);
  sub sound { 'neigh' }
}

{ package RaceHorse;
  our @ISA = qw(Horse);
  dbmopen(our %STANDINGS, "standings", 0666) or die "can't dbmopen standings dbm: $!";
  sub new {
      my $self = shift->SUPER::new(@_);
      my @standings = split ' ', $STANDINGS{$self->name} || "0 0 0 0";
      @$self{qw(wins places shows losses)} = @standings;
      $self;
  }
  sub DESTROY {
      my $self = shift;
      $STANDINGS{$self->name} = "@$self{qw(wins places shows losses)}";
      $self->SUPER::DESTROY;
  }
  sub won { shift->{wins}++; }
  sub placed { shift->{places}++; }
  sub showed {shift->{shows}++;}
  sub lost {shift->{losses}++;}
  sub standings {
      my $self = shift;
      join ", ", map "$self->{$_} $_", qw(wins places shows losses);
  }
}

my $runner = RaceHorse->new('Billy Boy');
$runner->won;
say $runner->name, ' has standings ', $runner->standings, '.';

入出力結果(Terminal)

$ ./sample.pl
Billy Boy has standings 1 wins, 0 places, 0 shows, 0 losses.
$ ./sample.pl
Billy Boy has standings 2 wins, 0 places, 0 shows, 0 losses.
$ ./sample.pl
Billy Boy has standings 3 wins, 0 places, 0 shows, 0 losses.
$ ./sample.pl
Billy Boy has standings 4 wins, 0 places, 0 shows, 0 losses.
$

ちなみにpython3.3の場合。

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
## Copyright (C) 2013 by kamimura
#-*- coding: utf-8 -*-

import os
import pickle

class LivingCreature:
    def speak(self, words=None):
        if words:
            print("a {0} goes '{1}'".format(
                self.__class__.__name__, words))
        else:
            print('a {0} goes {1}!'.format(
                self.__class__.__name__, self.sound()))

class Animal(LivingCreature):
    name = 'an unnamed'
    def __init__(self, name):
        self._name = name
        self._color = 'brown'
    def setName(self, name):
        self._name = name
    def getName(self):
        return self._name
    def setColor(self, color):
        self._color = color
    def getColor(self):
        return self._color
    def getSound(self):
        print('動物のsoundが定義されていない')
        sys.exit()
    def speak(self, words=None):
        if words:
            print('ドリトル博士ではないので、動物と話はできません!')
        else:
            print('a {0} goes {1}!'.format(
                self.__class__.__name__, self.sound()))

class Horse(Animal):
    def getSound(self):
        return 'neigh'

class RaceHorse(Horse):
    def __init__(self, name):
        Horse.__init__(self, name)
        self._filename = 'standings'
        if os.path.isfile(self._filename):
            with open(self._filename, 'rb') as f:
                self._standings = pickle.load(f)
        else:
            self._standings = dict.fromkeys(
                ['wins', 'places', 'shows', 'losses'], 0)
    def won(self):
        self._standings['wins'] += 1
    def placed(self):
        self._standings['places'] += 1
    def showed(self):
        self._standings['shows'] += 1
    def lost(self):
        self._standings['losses'] += 1
    def getStandings(self):
        with open(self._filename, 'wb') as f:
            pickle.dump(self._standings, f)
        return ', '.join(map(lambda x: '{0} {1}'.format(
                                 self._standings[x], x),
                             ['wins', 'places', 'shows', 'losses']))


runner = RaceHorse('Billy Boy')
runner.won()
print('{0} has standings {1}.'.format(
    runner.getName(), runner.getStandings()))

入出力結果(Terminal)

$ ./sample.py
Billy Boy has standings 1 wins, 0 places, 0 shows, 0 losses.
$ ./sample.py
Billy Boy has standings 2 wins, 0 places, 0 shows, 0 losses.
$ ./sample.py
Billy Boy has standings 3 wins, 0 places, 0 shows, 0 losses.
$ ./sample.py
Billy Boy has standings 4 wins, 0 places, 0 shows, 0 losses.
$

0 コメント:

コメントを投稿