argra****@users*****
argra****@users*****
2008年 12月 7日 (日) 02:33:49 JST
Index: docs/perl/5.10.0/perltoot.pod diff -u docs/perl/5.10.0/perltoot.pod:1.6 docs/perl/5.10.0/perltoot.pod:1.7 --- docs/perl/5.10.0/perltoot.pod:1.6 Sat Dec 6 03:44:52 2008 +++ docs/perl/5.10.0/perltoot.pod Sun Dec 7 02:33:48 2008 @@ -22,7 +22,7 @@ =end original オブジェクト指向プログラミングは、昨今のビッグセラーです。 -マネージャーには、薄切りパン(訳註:良い発明のこと)よりもむしろ +マネージャーには、薄切りパン(訳註: 良い発明のこと)よりもむしろ オブジェクトを持ちたがる人もいます。 どうしてでしょうか? オブジェクトの、何がそんなに特別なんでしょうか? @@ -673,7 +673,7 @@ Perl のリファレンスに基づく、ガベージコレクションが働かない唯一の状況は、 データ構造に循環性があるときです。 -次のようなものです: +次のようなものです: $this->{WHATEVER} = $this; @@ -783,7 +783,7 @@ =end original -または、次のようなもの: +または、次のようなもの: sub happy_birthday { my $self = shift; @@ -796,7 +796,7 @@ =end original -次のような方法でやると言う人もいるでしょう: +次のような方法でやると言う人もいるでしょう: sub exclaim { my $self = shift; @@ -882,7 +882,7 @@ モジュールで、期待されています。 ですが、このやり方は、一般的に、ほとんどのオブジェクト指向のモジュールでは、 むしろ下手なものと考えられています。 -オブジェクト指向のモジュールでは、(訳註:データを)保護をするベールを設けて、 +オブジェクト指向のモジュールでは、(訳註: データを)保護をするベールを設けて、 実装とインターフェースを分離します。 ですから、オブジェクトデータにアクセスするオブジェクトメソッドを 提供するのと同じように、クラスデータにアクセスするクラスメソッドを提供します。 @@ -911,7 +911,7 @@ ですが、たいていは、クラスデータをファイルスコープのレキシカル変数に したいと思います。 -そうするためには、ファイルの上の方で、単純に次のものを置けばいいのです: +そうするためには、ファイルの上の方で、単純に次のものを置けばいいのです: my $Census = 0; @@ -970,7 +970,7 @@ こうしたことで、もちろん、Person が壊れたときに、$Census を減らすために、 デストラクタが必要になります。 -次のようにします: +次のようにします: sub DESTROY { --$Census } @@ -1116,7 +1116,7 @@ =end original クラスにデバッグのメカニズムがあるのは、一般的です。 -たとえば、オブジェクトが作られるか、破壊される時に、(訳註:デバッグ情報を) +たとえば、オブジェクトが作られるか、破壊される時に、(訳註: デバッグ情報を) 見たいでしょう。 そうするためには、デバッグの値をファイルスコープのレキシカル変数に加えます。 このために、警告と致命的なメッセージを発する標準の Carp モジュールを @@ -1167,7 +1167,7 @@ =end original ひょっとしたら、オブジェクトごとに、デバッグ状態を持ちたいかも知れません。 -両方ともできるを方法があります: +両方ともできるを方法があります: Person->debug(1); # entire class $him->debug(1); # just this object @@ -1183,7 +1183,7 @@ こうするためには、デバッグメソッドは、「二頂の」メソッドで なければなりません。 クラス I<および> オブジェクトの両方で動くメソッドです。 -そのため、debug() と、DESTORY メソッドを次のように、調整します: +そのため、debug() と、DESTORY メソッドを次のように調整します: sub debug { my $self = shift; @@ -1240,8 +1240,9 @@ そのような I<クラスのデストラクタ> を作るために、 そのクラスパッケージの中に、END と名付けられる関数を作ります。 END の働きは、伝統的なモジュールの END 関数とちょうど似ています。 -プログラムが実行されないか、とらえられないシグナルで死んで、 +プログラムが実行されないか、捕らえられないシグナルで死んで、 プログラムが終了したときにいつでも呼ばれます。 +例えば、 sub END { if ($Debugging) { @@ -1277,7 +1278,7 @@ =end original -そして、ドキュメントがあります:今まで、このPersonクラスの I<実装> を +そして、ドキュメントがあります: 今まで、この Person クラスの I<実装> を 見せています。 Person クラスの I<インターフェース> は、Person クラスのドキュメントに なります。 @@ -1289,7 +1290,7 @@ pod2text プログラムで使われます。 Perlのコンパイラは、podをまったく無視します。 ちょうど、翻訳者がコードを無視するのと同じです。 -略式のインターフェースを記述する pod の例です: +略式のインターフェースを記述する pod の例です: =head1 NAME @@ -1342,7 +1343,7 @@ インターフェース対実装の問題があります。 モジュールを開いて、インターフェースの契約の後ろにある、安全に鍵を かけられた、全てのプライベートなほのかに輝く小さなものを、 -いじくりまわすようなプログラマには、保証が無効になります。 +いじくりまわすようなプログラマには、保証が無効になります; 彼らの運命を気に病むべきではありません。 =head1 Aggregation @@ -1402,7 +1403,7 @@ よし。 こうするために、Person::new() をフルネームのフィールドをサポートするように、 -次のように変えます: +次のように変えます: sub new { my $class = shift; @@ -1428,7 +1429,7 @@ =end original それから、古いコードをサポートするために、Person::name() を次のように -定義します: +定義します: sub name { my $self = shift; @@ -1444,9 +1445,9 @@ =end original -Fullname クラスがあります。 +これが Fullname クラスです。 データフィールドを持つのにハッシュリファレンスを使ったのと同じテクニックを -使い、データフィールドにアクセスするのに適切な名前でメソッドを使います: +使い、データフィールドにアクセスするのに適切な名前でメソッドを使います: package Fullname; use strict; @@ -1504,7 +1505,7 @@ =end original -最後に、テストプログラムです: +最後に、テストプログラムです: #!/usr/bin/perl -w use strict; @@ -1575,9 +1576,9 @@ そうでないときもあります。 Perlは、一つのクラス(や、複数のクラス)から、継承するのに特別な文法は ありません。 -その代わりに、意味論においては、全て厳しい。 -それぞれのパッケージには、@ISA と呼ばれる変数があり、@ISA は、(メソッド)継承を -治めるものです。 +その代わりに、全て厳密に意味論にあります。 +それぞれのパッケージには、@ISA と呼ばれる変数があり、@ISA は、 +(メソッド)継承を治めるものです。 もし、オブジェクトかクラスで、メソッドを呼ぼうとして、そのメソッドが、 そのオブジェクトのパッケージには見付からないと、Perl は、見付からない メソッドを検索するさいに、@ISA を見て、他のパッケージを探しに行きます。 @@ -1592,12 +1593,12 @@ =end original -特別なパッケージ毎の、Exporterで、見分けれる変数 -(@EXPORT, @ EXPORT_OK, @ EXPORT_FAIL,%EXPORT_TAGS,$VERSION)のように、 +特別なパッケージ毎の、Exporter で認識される変数 +(@EXPORT, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS, $VERSION) のように、 @ISA 配列は、パッケージスコープのグローバル変数で I<なければならず>、 my() で作られるファイルスコープのレキシカル変数であっては I<いけません>。 ほとんどのクラスで、@ISA 配列には一つのものしかありません。 -このことは、"単一継承"と呼ばれるものです。 +このことは、「単一継承」("single inheritance")と呼ばれるものです。 省略して、SI とも呼ばれます。 =begin original @@ -1606,7 +1607,7 @@ =end original -このクラスについて、考えてみましょう: +このクラスについて、考えてみましょう: package Employee; use Person; @@ -1639,11 +1640,12 @@ =end original -このような空のクラスを作ることは、"空のサブクラステスト"と呼ばれます。 -これは、基底クラスから継承する以外には、なにもしない派生クラスを作ることです。 +このような空のクラスを作ることは、「空のサブクラステスト」と呼ばれます。 +これは、基底クラスから継承する以外には、なにもしない派生クラスを +作ることです。 オリジナルの基底クラスは、適切に設計されていれば、 新しい派生クラスは、古いものの差し込み式の置換として、使われます。 -このことが意味するのは、次のようにプログラムを書けるということです: +このことが意味するのは、次のようにプログラムを書けるということです: use Employee; my $empl = Employee->new(); @@ -1668,9 +1670,9 @@ 上の方で定義している Person::new() 関数を見返したら、そうするように 注意しています。 コンストラクタで使われるパッケージデータが少しありますが、 -パッケージデータへのリファレンスが、オブジェクト自身に、蓄えられており、 -他の全てのメソッドはそのリファレンスを通して、パッケージデータに -アクセスします。 +パッケージデータへのリファレンスが、オブジェクト自身に蓄えられており、 +他の全てのメソッドはそのリファレンスを通してパッケージデータに +アクセスします; それで、よしとすべきです。 =begin original @@ -1693,8 +1695,8 @@ たぶん、原則的には、メソッドです。 メソッドは、ちょうど、その最初の引数に、クラスの名前(パッケージ)か、 オブジェクト(bless されたリファレンス)を期待する関数です。 -Person::new()は、結局、C<< Person->new() >> メソッドと C<< Employee->new() >> -メソッドの両方が呼んでいる関数です。 +Person::new()は、結局、C<< Person->new() >> メソッドと +C<< Employee->new() >> メソッドの両方が呼んでいる関数です。 メソッド呼び出しが関数呼び出しによく似ていながら、本当は、まったく 同じではなく、この 2 つを同じものとして扱うなら、すぐに壊れたプラグラムしか 残されないことを理解してください。 @@ -1733,7 +1735,7 @@ =end original -従業員が、ただの、Person だったら、それはあまり面白くありません。 +従業員がただの Person だったら、それはあまり面白くありません。 さあ、他のメソッドを追加しましょう。 従業員に、データフィールドを設けて、従業員の給与や、従業員 ID や、入社日に アクセスしましょう。 @@ -1749,9 +1751,9 @@ これらのオブジェクトのデータを取得するような、ほとんど同じメソッドたちを 作るのにちょっと飽きたとしても、落胆しないでください。 -後で、こういった作業を短縮するための、いくつかの種々の便利な +後で、こういった作業を短縮するためのいくつかの種々の便利な メカニズムについて説明します。 -その逆に、単純なやりかたは次のものです: +その逆に、単純なやりかたは次のものです: sub salary { my $self = shift; @@ -1791,7 +1793,7 @@ 例えば、従業員で、peers()メソッドを呼ぶと、(訳註:Personとは、)少々違った 動きをさせたいとしましょう。 同僚の名前のリストをただ返す代わりに、ちょっと違った文字列を返しましょう。 -次のようにします: +次のようにします: $empl->peers("Peter", "Paul", "Mary"); printf "His peers are: %s\n", join(", ", $empl->peers); @@ -1802,7 +1804,7 @@ =end original -次のようになります: +次のようになります: His peers are: PEON=PETER, PEON=PAUL, PEON=MARY @@ -1812,7 +1814,7 @@ =end original -こうするためには、単に、この定義を Employee.pm ファイルに加えるだけです。 +こうするためには、単に、この定義を Employee.pm ファイルに加えるだけです: sub peers { my $self = shift; @@ -1849,8 +1851,8 @@ =end original しばしば、派生クラス("サブクラス"としても知られるクラス)のもの -(訳註:version)とその基底クラス("スーパークラス"としても知られるクラス)の -もの(訳註:version)も同じように両方をきっかけをメソッドに呼ばせたいでしょう。 +(訳註: version)とその基底クラス("スーパークラス"としても知られるクラス)の +もの(訳註: version)も同じように両方をきっかけをメソッドに呼ばせたいでしょう。 実際に、コンストラクタとデストラクタは、そうすることを望んでいそうですし、 先にみた、debug() メソッドでは、十中八九、そうだとうなずけます。 @@ -1860,7 +1862,7 @@ =end original -そうするために、Employee.pm に次のものを加えます: +そうするために、Employee.pm に次のものを加えます: use Carp; my $Debugging = 0; @@ -1886,12 +1888,12 @@ =end original -お分かりのように、(訳註:Employee から)向きを変えて、Person パッケージの +お分かりのように、(訳註: Employee から)向きを変えて、Person パッケージの debug() 関数を呼びます。 ですが、良い設計にとっては、こうするのは、ひじょーに、壊れやすいものです。 Person が debug() 関数を持っておらず、I<その> debug() メソッドを 他のところから継承していたら、どうなるでしょう? -次のようにする方が、良いです。 +次のようにする方が良いです。 Person->debug($Debugging); @@ -1901,8 +1903,8 @@ =end original -ですが、まだ、ハードコードしすぎです。 -次のようにする方が、良いです。 +ですが、まだハードコードしすぎです。 +次のようにする方が良いです。 $self->Person::debug($Debugging); @@ -1927,10 +1929,10 @@ =end original -少しのものがまだ、あります。 +少しのものがまだあります。 スーパークラスの名前をハードコードしています。 -継承するクラスを変えるか、他のものを加えたら、このことは、特に、悪いです。 -幸運なことに、仮名クラスの SUPER が、ここで、助けになります。 +継承するクラスを変えるか、他のものを加えたら、このことは特に悪いです。 +幸運なことに、仮名クラスの SUPER がここで助けになります。 $self->SUPER::debug($Debugging); @@ -1944,7 +1946,7 @@ =end original -こうすると、自分のクラスの @ISA をのぞき始ます。 +こうすると、自分のクラスの @ISA をのぞき始めます。 これは、メソッドコール I<内> から意味をなすだけです。 他のどこからも、SUPER:: の何にも、アクセスしようとしないでください。 というのは、上書きされたメソッド呼出の外側には存在しないからです。 @@ -1961,13 +1963,13 @@ =end original -事態は、ちょっと複雑になってきています。 +事態はちょっと複雑になってきています。 してはならないことをしたでしょうか? これまでのように、まともなクラスかどうかをテストする一つの方法は、 空のサブクラスを経由するテストです。 すでに、チェックしている Employee クラスがあるので、 -Employee から、新しい空のサブクラスを生成できます。 -次のものです: +Employee から新しい空のサブクラスを生成できます。 +次のものです: package Boss; use Employee; # :-) @@ -1979,7 +1981,7 @@ =end original -テストプログラムです: +テストプログラムです: #!/usr/bin/perl -w use strict; @@ -2007,10 +2009,10 @@ =end original -実行すると、まだ、大丈夫です。 -素敵なフォーマットで、デバッガーで 'x'コマンドを働かせる方法のように、 +実行すると、まだ大丈夫です。 +素敵なフォーマットで、デバッガで 'x' コマンドを働かせる方法のように オブジェクトをダンプしたいなら、CPAN から、Data::Dumpler モジュールを -次のように使うことが出来ます: +次のように使うことが出来ます: use Data::Dumper; print "Here's the boss:\n"; @@ -2022,7 +2024,7 @@ =end original -次のようなものを見せます: +次のようなものを見せます: Here's the boss: $VAR1 = bless( { @@ -2055,14 +2057,14 @@ ふーむ、何かがなくなっています。 給与、入社日、ID フィールドはどうでしょうか? -たぶん、それらに、何も、undef さえもセットしていません。 -そのため、ハッシュのキーに、それらが見えなかったのです。 +たぶん、それらに何も、undef さえもセットしていません。 +そのため、ハッシュのキーにそれらが見えなかったのです。 Employee クラスは、それ自身の new() メソッドがありません。 Person の new() メソッドは、Employee について知りません。 -(また、そうすべきでもありません:適切なオブジェクト指向設計はサブクラスが +(また、そうすべきでもありません: 適切なオブジェクト指向設計はサブクラスが そのすぐ上のスーパークラスについて知っていてもよいと指示しています。 ですが、その逆は同様ではありません)。 -では、Employee::new() を次のように、しましょう: +では、Employee::new() を次のようにしましょう: sub new { my $class = shift; @@ -2103,7 +2105,7 @@ よし、初心者もオブジェクト指向のエキスパートも混乱させる危険をおかしても、 白状する時がきました。 -Perl のオブジェクトシステムは、多重継承、または、略してMIとして知られる、 +Perl のオブジェクトシステムは、多重継承、または、略してMI として知られる、 賛否両論の考えを含んでいます。 これが意味するのは、次のことで全てです。 ただ一つの親クラス - 今度は、それ自身が親クラスやそのほかを持っている - を @@ -2123,9 +2125,9 @@ =end original -多重継承のやりかたは、実際、非常に簡単です:@ISA 配列に二つ以上の +多重継承のやりかたは、実際、非常に簡単です: @ISA 配列に二つ以上の パッケージ名を置けばいいだけです。 -Perlが、オブジェクトのために、メソッドを見つけに行く時がきたら、 +Perl が、オブジェクトのために、メソッドを見つけに行く時がきたら、 順番に @ISA のパッケージをそれそれ見ます。 えっと、かなり。 完全に再帰的で、デフォルトでは深さ優先です(その他の順序解決手法については @@ -2155,7 +2157,8 @@ =end original -spin() メソッド(または、さらに言えば、new())をどのように見つけるのでしょうか? +spin() メソッド(または、さらに言えば、new())をどのように +見つけるのでしょうか? 検索は、深さ優先なので、クラスは次の順番で調べられます: Third, First, Alpha, Second, Beta の順です。 @@ -2172,10 +2175,10 @@ 実際には、多重継承が使われているクラスモジュールは、ほとんどみかけません。 ほとんどいつも、多重継承ではなく、一つのクラスは他の一つのクラスに 含まれているという単純なコンテナ関係を選びます。 -これが、なぜ Person オブジェクトは、Fullname オブジェクトを I<含んでいる> か -という理由です。 -これは、Person オブジェクトが Fullname オブジェクトで I<あった> ということを -意味しません。 +これが、なぜ Person オブジェクトは、Fullname オブジェクトを +I<含んでいる> かという理由です。 +これは、Person オブジェクトが Fullname オブジェクトで I<あった> と +いうことを意味しません。 =begin original @@ -2190,12 +2193,12 @@ =end original しかしながら、Perl での多重継承が見境のない、一つの特別な領域があります: -他のクラスのクラスメソッドを借りて来ることです。 +他のクラスのクラスメソッドを借りてくることです。 このことは、幾分普及しており、 -バンドルされている"オブジェクトのない"クラスで特にそうです。 +バンドルされている「オブジェクトのない」クラスで特にそうです。 Exporter や、DynaLoader や、AutoLoader や、SelfLoader がそうです。 これらのクラスは、コンストラクタを提供しません。 -これらのクラスは、(訳註:他のクラスから)クラスメソッドを +これらのクラスは、(訳註: 他のクラスから)クラスメソッドを 継承するかもしれないので、存在しています。 =begin original @@ -2204,7 +2207,7 @@ =end original -たとえば、POSIX モジュールの @ISA は次のようになっています: +たとえば、POSIX モジュールの @ISA は次のようになっています: package POSIX; @ISA = qw(Exporter DynaLoader); @@ -2276,10 +2279,10 @@ すべてのオブジェクトに共通のメソッドを与えるのに、それぞれの @ISA に クラスを加えずにできる方法です。 それで、そうできることがわかります。 -それを見ることはありませんが、Perl は、それとなく、決定的に、 - @ ISA の終わりに、特別な要素があることを想定しています:UNIVERSAL クラスです。 -5.003 では、UNIVERSAL クラスにあらかじめ定義されているメソッドは、 -ありませんでしたが、UNIVERSAL クラスにいれたいようなものは、なんでも、 +あなたはそれを見ることはありませんが、Perl は暗黙にかつ決定的に、 + @ ISA の終わりに特別な要素があることを想定しています: UNIVERSAL クラスです。 +5.003 では、UNIVERSAL クラスにあらかじめ定義されているメソッドは +ありませんでしたが、UNIVERSAL クラスにいれたいようなものは、なんでも 置くことが出来ました。 =begin original @@ -2294,11 +2297,11 @@ しかし、5.004 (または、5.003_08 のような、いくつかの破棄的なリリース)より、 UNIVERSAL には、既にいくつかのメソッドがあります。 -これらのメソッドは、Perl バイナリに組み込まれており、そのため、それらを -ロードするのに、余計な時間はかかりません。 -あらかじめ定義されているメソッドは、isa() 、can()、VERSION() です。 -isa() は、オブジェクトかクラスが階層構造を横断することなく、 -別のクラス"である"かどうかを教えます。 +これらのメソッドは Perl バイナリに組み込まれており、そのため、それらを +ロードするのに余計な時間はかかりません。 +あらかじめ定義されているメソッドは、isa(), can(), VERSION() です。 +isa() はオブジェクトかクラスが、階層構造を横断することなく、 +別のクラス「である」かどうかを教えます: $has_io = $fd->isa("IO::Handle"); $itza_handle = IO::Socket->isa("IO::Handle"); @@ -2313,7 +2316,7 @@ can() メソッドは、オブジェクトかクラスに対して呼ばれて、その文字列の引数が そのクラスで、呼ぶことの出来るメソッドかどうかを帰って報告します。 -実際、そのメソッドに関数のリファレンスを返します: +実際、そのメソッドに関数のリファレンスを返します: $his_print_method = $obj->can('as_string'); @@ -2326,8 +2329,8 @@ 最後に、VERSION メソッドは、クラス(または、オブジェクトのクラス)が、 $VERSION と呼ばれるパッケージのグローバル変数が十分に高いかどうかを -チェックします。 -次のように: +チェックします; +次のように: Some_Module->VERSION(3.0); $his_vers = $ob->VERSION(); @@ -2344,8 +2347,8 @@ しかし、ふつう、VERSION を自分自身には呼びません。 (次のことを覚えておいてください。 すべての大文字の関数名は、Perl の慣例で、その関数が、なんらかの方法で、 -Perl によって自動的に使われるだろうということを、示しています。) -このケースでは、次のようにすると、同じことが起こります: +Perl によって自動的に使われるだろうということを示しています。) +このケースでは、次のようにすると同じことが起こります: use Some_Module 3.0; @@ -2357,7 +2360,7 @@ =end original 上に説明した Person クラスでバージョンのチェックを加えたいなら、 -Person.pm に、次のことを加えるだけです: +Person.pm に、次のことを加えるだけです: our $VERSION = '1.1'; @@ -2367,7 +2370,7 @@ =end original -そして、Employee.pm で、次のようにできます: +そして、Employee.pm で、次のようにできます: use Person 1.1; @@ -2383,8 +2386,8 @@ このことで、少なくともそのバージョン番号か、それより高いものが利用可能だと 確かめます。 正確なバージョン番号でのロードなので、同じではありません。 -現在のところ、共同に作用する複数のバージョンのモジュールの -インストレーションのためには、どんなメカニズムもありません。 +現在のところ、あるモジュールの複数のバージョンを同時にインストールする +機構はありません。 嘆かわしい。 =head2 Deeper UNIVERSAL details @@ -2402,7 +2405,7 @@ =end original -(おそらくほとんどの場合で賢明ではないですが)@UNIVERSAL::ISA に他の +(おそらくほとんどの場合で賢明ではないですが) @UNIVERSAL::ISA に他の パッケージ名を入れることもできます。 これらのパッケージも UNIVERSAL 自身と同様、全てのクラスによって 暗黙的に継承されます。 @@ -2451,10 +2454,9 @@ =end original -All of the above is made more intuitive by realizing what really -happens during method lookup, which is roughly like this -ugly pseudo-code: -(TBT) +上記の全ては、メソッド検索中に実際に何が起きるのかを実感することで +より分かりやすくなります; これはおおよそ以下のような醜い擬似コードの +ようになります: =begin original @@ -2473,7 +2475,7 @@ =end original get_mro(class) { - # クラスの @ISA の開始から再起して、適切な順序の + # クラスの @ISA の開始から再帰して、適切な順序の # 検索する全てのクラスの単一の線形の配列を作成します。 # 使用されるメソッド解決順序 (mro) は、これにセットされている # mro「クラス」によります(デフォルト(深さ優先左から右)か @@ -2554,7 +2556,7 @@ クラスを使う人が、契約を支持し、公示されたインターフェースに我慢するなら、 その基礎を成すインターフェースを、そうしたければ変えることが出来ます。 -同じインターフェースの仕様に合う、他の実装です。 +これは同じインターフェースの仕様に合う、もう一つの実装です。 さて、オブジェクトを表現するのに、ハッシュリファレンスの代わりに、 配列リファレンスを使いましょう。 @@ -2631,9 +2633,9 @@ 配列アクセスはハッシュアクセスより、だいぶ速いと思うかもしれません。 ですが、この2つは、実際は、類似のものです。 配列は、I<ちょっと> 速いです。 -ですが、10か、50パーセントも速くはありません。 +ですが、10 とか、15 パーセントも速くはありません; たとえ、上の $AGE のような文字の変数を、1 のような数字に置き換えても、です。 -二つのアプローチの大きな違いは、メモリの使用で見つけられます。 +二つの手法のより大きな違いは、メモリの使用で見つけられます。 ハッシュでの表現は、配列での表現よりもメモリを多く消費します。 値と同じように、キーにも、メモリを割り当てなければならないからです。 しかし、そのことは、本当に、そんなに悪いことではありません。 @@ -2657,7 +2659,7 @@ まだ、スピード(と、メモリで、幾分大きくなるところ)で、ちょっと 優れていることは、プログラマに、単純なクラスのために配列表現を 選ばせるのに十分です。 -やはり、拡張性にちょっとした問題があります。 +やはり、拡張性にちょっとした問題があります; 後年、サブクラスを作ろうとと思ったときに、ハッシュがちょうどうまく 働くことがわかるでしょうから。 @@ -2684,8 +2686,8 @@ 世界中で唯一人しか、オブジェクトのデータを見ることが出来ない、 新しい匿名の(クロージャ)関数を作ることが出来ます。 というのは、データをレキシカルにしか見えない無名ハッシュに置くからです。 -つまり、クロージャを作り、blessし、オブジェクトとして返すからです。 -このオブジェクトメソッドは、一変して、普通のサブルーチン呼出として +つまり、クロージャを作り、bless し、オブジェクトとして返すからです。 +このオブジェクトメソッドは、一変して、普通のサブルーチン呼び出しとして クロージャを呼び、影響を与えたいフィールドに、それを渡します。 (はい、二重の関数呼び出しは、遅いです。 ですが、もし、速さを求めるのなら、オブジェクトを全く使わなければいいんです。 @@ -2697,7 +2699,7 @@ =end original -使いかたは、前と似ています; +使いかたは、前と似ています: use Person; $him = Person->new(); @@ -2785,7 +2787,7 @@ =end original C<$him-E<gt>name("Jason")> のようなメソッドが呼ばれると、暗黙の 0 番目の -引数がデフォルトとして呼び出されます -- 全てのメソッド呼出と一緒のように。 +引数がデフォルトとして呼び出されます -- 全てのメソッド呼び出しと同様です。 ですが、この場合では、その引数は先ほどのコードリファレンスです(C++ での ポインタ関数のような何か、ですが、レキシカルな変数に深く バインドされています)。 @@ -2999,7 +3001,7 @@ ファイルスコープのレキシカルな(C のファイル static のような)ハッシュ リファレンスです。 なぜ、アンダースコアがあるのか? -かつて使った、_CENSUS フィールドと同じ理由のためです: +かつて使った、_CENSUS フィールドと同じ理由のためです: 「内部的に使うためだけ」を意味するマークです。 =begin original @@ -3140,7 +3142,7 @@ =end original -気をつけ方です: +気をつけ方です: package Employee; use Person; @@ -3387,7 +3389,7 @@ =end original -実装は次のようになります: +実装は次のようになります: package Net::hostent; use strict;