argra****@users*****
argra****@users*****
2012年 12月 25日 (火) 00:20:50 JST
Index: docs/perl/5.10.1/perlboot.pod diff -u docs/perl/5.10.1/perlboot.pod:1.2 docs/perl/5.10.1/perlboot.pod:1.3 --- docs/perl/5.10.1/perlboot.pod:1.2 Wed Sep 26 00:45:35 2012 +++ docs/perl/5.10.1/perlboot.pod Tue Dec 25 00:20:50 2012 @@ -23,11 +23,10 @@ =end original -他の言語でオブジェクトに親しんでいたのでなければ、 -他の Perl オブジェクトのドキュメントのいくつかは気力をくじかせるでしょう; -オブジェクトを使うための基本的なリファレンス L<perlobj>、 -Perl のオブジェクトシステムの特性のチュートリアル的な紹介 L<perltoot> -等のように。 +他の言語でオブジェクトに親しんでいたのでなければ、他の Perl オブジェクトの +ドキュメントのいくつかは気力をくじかせるでしょう; +オブジェクトを使うための基本的なリファレンス L<perlobj>、Perl の +オブジェクトシステムの特性のチュートリアル的な紹介 L<perltoot> 等のように。 =begin original @@ -38,8 +37,8 @@ =end original -そこで、別のアプローチをとって、 -オブジェクトの経験がないことを前提にしましょう。 +そこで、別のアプローチをとって、オブジェクトの経験がないことを +前提にしましょう。 もし、サブルーチン(L<perlsub>)や、リファレンス(L<perlref>等)、 パッケージ(L<perlmod>) を知っているのならそれが役に立ちますので、 もしまだわからなければまずそちらを先に知っておくべきでしょう。 @@ -90,9 +89,9 @@ =end original -目新しいコトはありません。 -別々のパッケージに分かれていて完全なパッケージ名を使って -呼び出していますが、単なるサブルーチンです。 +目新しいことはありません。 +別々のパッケージに分かれていて完全なパッケージ名を使って呼び出していますが、 +単なるサブルーチンです。 では、牧場を作ってみましょう。 # Cow::speak, Horse::speak, Sheep::speak as before @@ -129,8 +128,8 @@ ここにあるシンボリック coderef のデリファレンスはかなり粗雑です。 C<no strict refs> モードも考えてみると、大きなプログラムには全然向きません。 なぜその様なものが必要とされるのでしょう? -それはパッケージ名を、そのパッケージの呼び出そうとしている -サブルーチンの名前から分離できないからです。 +それはパッケージ名を、そのパッケージの呼び出そうとしているサブルーチンの +名前から分離できないからです。 =begin original @@ -255,8 +254,8 @@ でも、コードをよく見てみると、各 C<speak> 関数はよく似た構造を持っています。 C<print> 演算子と、2 語を除くと同一のテキストを含んでいるだけです。 -共通箇所を分解するのはよいことです; -例えば、後で全ての C<goes> を C<says> に変えることもできるようになります。 +共通箇所を分解するのはよいことです; 例えば、後で全ての C<goes> を C<says> に +変えることもできるようになります。 =begin original @@ -266,9 +265,9 @@ =end original -また、大騒ぎすることなくそれを行う方法も実際ありますが、 -メソッド呼び出しの矢印が何を行ってくれているのかについて -ここで少し知っておかなければなりません。 +また、大騒ぎすることなくそれを行う方法も実際ありますが、メソッド呼び出しの +矢印が何を行ってくれているのかについてここで少し +知っておかなければなりません。 =head2 The extra parameter of method invocation @@ -306,9 +305,8 @@ (もし関数を見つけることができなかったときには、「継承」が走査されます。 これに関してはあとで説明します。) これは最初のパラメータとしてクラス名を得ることを意味します -(もし引数がなければそれがただ1 つのパラメータになります)。 -このことから C<Sheep> のおしゃべり関数を次のように書き改めることが -できます: +(もし引数がなければそれがただ一つのパラメータになります)。 +このことから C<Sheep> のおしゃべり関数を次のように書き改めることができます: sub Sheep::speak { my $class = shift; @@ -378,7 +376,7 @@ さて、C<< Cow->speak >> を呼び出すと C<speak> では C<$class> として C<Cow> を得ました。 -これをつかって C<moooo> を返す C<< Cow->sound >> メソッドを選択します。 +これを使って C<moooo> を返す C<< Cow->sound >> メソッドを選択します。 では C<Horse> の時はどこが変わるでしょう。 { package Horse; @@ -468,7 +466,7 @@ 今回は単純に C<Cow> だけです。 それから Perl は C<Cow::speak> を探します。 しかしそれはありません; そのため Perl は継承配列 C<@Cow::ISA> を調べます。 -それは存在し、名前を 1 つ C<Animal> を格納しています。 +それは存在し、名前を一つ C<Animal> を格納しています。 =begin original @@ -492,7 +490,7 @@ =end original C<Animal::speak> 関数においては、C<$class> は C<Cow> になります -(これが 1 つめの引数です)。 +(これが一つめの引数です)。 そのため C<< $class->sound >> の呼び出しにおいて C<< Cow->sound >> を 得ます; 最初は C<@ISA> を探すことなく調べます。 そしてこれは成功します。 @@ -510,11 +508,11 @@ =end original -この魔法の C<@ISA> 変数は、 -C<Cow> が C<Animal> の「一種である(is-a)」と宣言しています。 -これが単なる 1 つの値ではなく配列であることに注意してください; +この魔法の C<@ISA> 変数は、C<Cow> が C<Animal> の「一種である(is-a)」と +宣言しています。 +これが単なる一つの値ではなく配列であることに注意してください; 稀ではありますが、メソッドが見つからなかったときに探す親クラスを -1 つ以上もつこともあるためです。 +一つ以上もつこともあるためです。 =begin original @@ -565,8 +563,7 @@ =end original -Or declare it as package global variable: -(TBT) +またはこれをパッケージグローバル変数として宣言します: package Cow; our @ISA = qw(Animal); @@ -591,10 +588,9 @@ =end original -If the C<Animal> class comes from another (object-oriented) module, then -just employ C<use base> to specify that C<Animal> should serve as the basis -for the C<Cow> class: -(TBT) +C<Animal> クラスが他の (オブジェクト指向) モジュールから来ている場合、 +C<Animal> が C<Cow> クラスの規定となることを指定するために、単に +C<use base> を使います: package Cow; use base qw(Animal); @@ -605,8 +601,7 @@ =end original -Now that's pretty darn simple! -(TBT) +これでかなり単純になりました! =head2 Overriding the methods @@ -664,13 +659,13 @@ これは、「オーバーライド」と呼ばれています。 事実、C<Mouse> が C<Animal> の一種であるという必要はまったくありません。 おしゃべり(C<speak>)に必要なメソッドは全て C<Mouse> に定義されています; -this is known as "duck typing": -"If it walks like a duck and quacks like a duck, I would call it a duck" -(James Whitcomb). However, it would probably be beneficial to allow a -closer examination to conclude that a C<Mouse> is indeed an C<Animal>, -so it is actually better to define C<Mouse> with C<Animal> as its base -(that is, it is better to "derive C<Mouse> from C<Animal>"). -(TBT) +これは「ダックタイピング」(duck typing) として知られています": +「あひるのように歩いてあひるのように鳴くなら、あひると呼ぼう」 +(James Whitcomb)。 +しかし、C<Mouse> が確かに C<Animal> であると結論づけるためのより詳細な検査を +出来ることはおそらく有益なので、実際には C<Animal> を基底として C<Mouse> を +定義する方が良い(つまり、「C<Animal> から C<Mouse> を派生させる方が +良い」)です。 =begin original @@ -683,13 +678,12 @@ =end original -Moreover, this duplication of code could become a maintenance headache -(though code-reuse is not actually a good reason for inheritance; good -design practices dictate that a derived class should be usable wherever -its base class is usable, which might not be the outcome if code-reuse -is the sole criterion for inheritance. Just remember that a C<Mouse> -should always act like an C<Animal>). -(TBT) +さらに、このような重複は頭痛の種となります (しかしコードの再利用は +実際には継承の良い理由ではありません; よい設計プラクティスは基底クラスが +使えるところではどこでも派生クラスが使えるべきと指示していて、 +コードの再利用が継承の唯一の基準だと効果がないかもしれません。 +単に C<Mouse> は常に C<Animal> のように動作するべきと言うことを +覚えておいてください)。 =begin original @@ -697,8 +691,7 @@ =end original -So, let's make C<Mouse> an C<Animal>! -(TBT) +それで、C<Mouse> を C<Animal> にしましょう! =begin original @@ -706,8 +699,7 @@ =end original -The obvious solution is to invoke C<Animal::speak> directly: -(TBT) +明らかな解決方法は C<Animal::speak> を直接起動することです: # Animal package from before { package Mouse; @@ -730,12 +722,11 @@ =end original -Note that we're using C<Animal::speak>. If we were to invoke -C<< Animal->speak >> instead, the first parameter to C<Animal::speak> -would automatically be C<"Animal"> rather than C<"Mouse">, so that -the call to C<< $class->sound >> in C<Animal::speak> would become -C<< Animal->sound >> rather than C<< Mouse->sound >>. -(TBT) +C<Animal::speak> を使っていることに注意してください。 +代わりに C<< Animal->speak >> を起動すると、C<Animal::speak> への最初の引数は +C<"Mouse"> ではなく自動的に C<"Animal"> になるので、C<Animal::speak> での +C<< $class->sound >> の呼び出しは C<< Mouse->sound >> ではなく +C<< Animal->sound >> になります。 =begin original @@ -745,10 +736,9 @@ =end original -Also, without the method arrow C<< -> >>, it becomes necessary to specify -the first parameter to C<Animal::speak> ourselves, which is why C<$class> -is explicitly passed: C<Animal::speak($class)>. -(TBT) +また、メソッド矢印 C<< -> >> なしだと、C<Animal::speak> への最初の引数を +自分自身で指定する必要があるようになります; これが C<$class> が明示的に +渡されている理由です: C<Animal::speak($class)>。 =begin original @@ -760,12 +750,11 @@ =end original -However, invoking C<Animal::speak> directly is a mess: Firstly, it assumes -that the C<speak> method is a member of the C<Animal> class; what if C<Animal> -actually inherits C<speak> from its own base? Because we are no longer using -C<< -> >> to access C<speak>, the special method look up mechanism wouldn't be -used, so C<speak> wouldn't even be found! -(TBT) +しかし、直接 C<Animal::speak> を起動するのは大変です: 最初に、C<speak> +メソッドは C<Animal> クラスのメンバであることを仮定しています; +C<Animal> が実際には独自の基底クラスから C<speak> を継承していたら? +もはや C<speak> にアクセスするのに C<< -> >> を使わないので、特別なメソッド +検索機構が使われておらず、C<speak> は発見すらされていません! =begin original @@ -778,13 +767,13 @@ =end original -The second problem is more subtle: C<Animal> is now hardwired into the subroutine -selection. Let's assume that C<Animal::speak> does exist. What happens when, -at a later time, someone expands the class hierarchy by having C<Mouse> -inherit from C<Mus> instead of C<Animal>. Unless the invocation of C<Animal::speak> -is also changed to an invocation of C<Mus::speak>, centuries worth of taxonomical -classification could be obliterated! -(TBT) +二つ目の問題はより微妙です: C<Animal> はサブルーチン選択に +ハードコーディングされています。 +C<Animal::speak> が存在すると仮定してみましょう。 +後で起こることは、誰かが C<Mouse> を C<Animal> ではなく C<Mus> から +継承することでクラス階層を拡張します。 +C<Animal::speak> の起動が C<Mus::speak> の起動も変更されない限り、 +分類学の世紀的な価値が破壊されます! =begin original @@ -794,10 +783,8 @@ =end original -What we have here is a fragile or leaky abstraction; it is the beginning of a -maintenance nightmare. What we need is the ability to search for the right -method wih as few assumptions as possible. -(TBT) +ここにあるものは脆弱で漏れやすい抽象化です; これは保守の悪夢の始まりです。 +必要としているものは出来るだけ仮定を少なくして正しいメソッドを探す能力です。 =head2 Starting the search from a different place @@ -810,9 +797,9 @@ =end original -A I<better> solution is to tell Perl where in the inheritance chain to begin searching -for C<speak>. This can be achieved with a modified version of the method arrow C<< -> >>: -(TBT) +I<よりよい> 解決法は、継承チェーンのどこから C<speak> の検索を始めるのかを +Perl に伝えることです。 +これはメソッド矢印 C<< -> >> の修正版で達成できます: ClassName->FirstPlaceToLook::method @@ -822,8 +809,7 @@ =end original -So, the improved C<Mouse> class is: -(TBT) +それで、改良された C<Mouse> クラスは: # same Animal as before { package Mouse; @@ -847,7 +833,7 @@ この構文を使うことで、C<speak> の探索を C<Animal> から開始することができ、 それから直接見つからなくても C<Animal> の全ての継承連鎖を使う ことができます。 -いつも通り、C<speak> への 1 つめのパラメータは C<$class> になるため、 +いつも通り、C<speak> への一つめのパラメータは C<$class> になるため、 もはや C<$class> を明示的に C<speak> に渡す必要はありません。 =begin original @@ -857,9 +843,8 @@ =end original -But what about the second problem? We're still hardwiring C<Animal> into -the method lookup. -(TBT) +しかし、二つ目の問題はどうでしょう? +まだメソッド検索に C<Animal> をハードコーディングしています。 =head2 The SUPER way of doing things @@ -874,11 +859,9 @@ =end original -If C<Animal> is replaced with the special placeholder C<SUPER> in that -invocation, then the contents of C<Mouse>'s C<@ISA> are used for the -search, beginning with C<$ISA[0]>. So, all of the problems can be fixed -as follows: -(TBT) +この起動で C<Animal> が特別なプレースホルダ C<SUPER> で置き換えられると、 +C<Mouse> の C<@ISA> の内容が使われ、C<$ISA[0]> から始められます。 +それで、以下のようにして全ての問題が修正できます: # same Animal as before { package Mouse; @@ -900,10 +883,9 @@ =end original 一般的に、C<SUPER::speak> は現在のパッケージの C<@ISA> から C<speak> を -実装するクラス探し、最初に見つかったものを呼び出します。 -The placeholder is called C<SUPER>, because many other languages refer -to base classes as "I<super>classes", and Perl likes to be eclectic. -(TBT) +実装するクラスを探し、最初に見つかったものを呼び出します。 +プレースホルダは C<SUPER> と呼ばれます; その他の言語では基底クラスを +"I<super>classes"(スーパークラス)として参照し、Perl は折衷主義だからです。 =begin original @@ -911,8 +893,7 @@ =end original -Note that a call such as -(TBT) +以下のように呼び出すと $class->SUPER::method; @@ -923,9 +904,8 @@ =end original -does I<not> look in the C<@ISA> of C<$class> unless C<$class> happens to -be the current package. -(TBT) +C<$class> がたまたま現在のパッケージでない限り、C<$class> の C<@ISA> を +I<見ない> ことに注意してください。 =head2 Let's review... @@ -993,12 +973,8 @@ この簡単な構文を使うことでクラスメソッド、(複数の)継承、オーバーライド、 そして拡張を行えるようになりました。 -これまでに見てきたもの丈で共通処理を抽出し、 -(though that's never a good reason -for inheritance!), -様々な実装に再利用する -良好な方法を提供することができます。 -(TBT) +これまでに見てきたもので共通処理を抽出し、(しかし、これは決して継承のよい +理由ではありません!)、様々な実装に再利用する良好な方法を提供できます。 =begin original @@ -1006,8 +982,7 @@ =end original -Now, what about data? -(TBT) +それで、データについては? =head2 A horse is a horse, of course of course -- or is it? @@ -1041,9 +1016,8 @@ =end original -C<< Horse->speak >> を呼び出すことで C<Animal::speak> に渡り、 -そこから C<Horse::sound> に鳴き声を作りに戻ります; 結果は -次のようになります: +C<< Horse->speak >> を呼び出すことで C<Animal::speak> に渡り、そこから +C<Horse::sound> に鳴き声を作りに戻ります; 結果は次のようになります: a Horse goes neigh! @@ -1072,9 +1046,7 @@ =end original -That is to say, we want particular instances of C<Horse> to have -different names. -(TBT) +これは言わば、特定の C<Horse> のインスタンスに別の名前を付けたいです。 =begin original @@ -1115,12 +1087,12 @@ =end original -これはパッケージ名 C<Horse> に関する情報を -リファレンスに指されているものに格納する操作を行います。 +これはパッケージ名 C<Horse> に関する情報をリファレンスに指されているものに +格納する操作を行います。 これにより、C<$horse> が C<Horse> のインスタンスになったといいます。 これで、個々の馬を識別できます。 -リファレンスはそれ以外に変化はありませんし、 -伝統的なデリファレンス操作を使うこともできます。 +リファレンスはそれ以外に変化はありませんし、伝統的なデリファレンス操作を +使うこともできます。 =head2 Invoking an instance method @@ -1133,8 +1105,8 @@ =end original -メソッド矢印はクラス(パッケージ名)の時と同じように、 -インスタンスに対しても使うことができます。 +メソッド矢印はクラス(パッケージ名)の時と同じように、インスタンスに対しても +使うことができます。 では、C<$horse> の作り出す音を取り出してみましょう: my $noise = $horse->sound("some", "unnecessary", "args"); @@ -1147,8 +1119,8 @@ =end original -C<sound> を呼び出すために、Perl は始めに C<$horse> が -bless されたリファレンス(つまりインスタンス)であることを確認します。 +C<sound> を呼び出すために、Perl は始めに C<$horse> が bless された +リファレンス(つまりインスタンス)であることを確認します。 それからいつも通り引数リストを構成します。 =begin original @@ -1161,14 +1133,11 @@ =end original -さて、ここがおもしろいところです: -Perl はインスタンスが bless されているクラス、今回は C<Horse> を取り出し、 -サブルーチンの場所を特定するためにそのクラスを使います。 -今回は、C<Horse::sound> が直接に(継承を使うことなしに) -みつかります。 -In the end, it is as though our initial line were -written as follows: -(TBT) +さて、ここがおもしろいところです: Perl はインスタンスが bless されている +クラス、今回は C<Horse> を取り出し、サブルーチンの場所を特定するためにその +クラスを使います。 +今回は、C<Horse::sound> が直接に (継承を使うことなしに) 見つかります。 +結局、最初の行は以下のように書いたかのようになります: my $noise = Horse::sound($horse, "some", "unnecessary", "args"); @@ -1180,10 +1149,10 @@ =end original -この最初のパラメータは、先ほどのようなクラス名ではなく -インスタンスのままである点に注意してください。 -この結果 C<neigh> を復帰値として受け取り、 -これが C<$noise> 変数に代入されます。 +この最初のパラメータは、先ほどのようなクラス名ではなく、インスタンスの +ままである点に注意してください。 +この結果 C<neigh> を復帰値として受け取り、これが C<$noise> 変数に +代入されます。 =begin original @@ -1195,11 +1164,11 @@ =end original -もし Horse::sound が見つからなかったときには、スーパークラスの -中でメソッドが見つかるかどうか C<@Horse::ISA> 配列をたどります。 -クラスメソッドとインスタンスメソッドとの違いは -その最初の引数がインスタンス(bless されたリファレンス) -なのかクラス名(文字列)なのかという点だけです。 +もし Horse::sound が見つからなかったときには、スーパークラスの中でメソッドが +見つかるかどうか C<@Horse::ISA> 配列をたどります。 +クラスメソッドとインスタンスメソッドとの違いは、その最初の引数が +インスタンス(bless されたリファレンス)なのかクラス名(文字列)なのかという +点だけです。 =head2 Accessing the instance data @@ -1232,8 +1201,7 @@ =end original -Inside C<Horse::name>, the C<@_> array contains: -(TBT) +C<Horse::name> の内側では、C<@_> 配列の中身は: ($horse, "some", "unnecessary", "args") @@ -1244,9 +1212,9 @@ =end original -so the C<shift> stores C<$horse> into C<$self>. Then, C<$self> gets -de-referenced with C<$$self> as normal, yielding C<"Mr. Ed">. -(TBT) +なので C<shift> は C<$horse> を C<$self> に保管します。 +それから C<$self> は通常通り C<$$self> でデリファレンスされ、C<"Mr. Ed"> と +なります。 =begin original @@ -1256,10 +1224,8 @@ =end original -It's traditional to C<shift> the first parameter into a variable named -C<$self> for instance methods and into a variable named C<$class> for -class methods. -(TBT) +インスタンスメソッドでは C<$self> という名前の変数に、クラスメソッドでは +C<$class> という名前の変数に最初の引数を C<shift> するのは慣習です。 =begin original @@ -1267,8 +1233,7 @@ =end original -Then, the following line: -(TBT) +それから、以下の行は: print $horse->name, " says ", $horse->sound, "\n"; @@ -1278,8 +1243,7 @@ =end original -outputs: -(TBT) +以下を出力します: Mr. Ed says neigh. @@ -1300,9 +1264,9 @@ もちろん、すべての馬を手で作っていては時々失敗することもあるでしょう。 また馬の「内臓」が外から見えてしまうのはオブジェクト指向 -プログラミングの約束事を 1 つ破っています。 -もしあなたが獣医であればそれもよいでしょうが、 -自分の馬を持ちたいだけであればそうではありません。 +プログラミングの約束事を一つ破っています。 +もしあなたが獣医であればそれもよいでしょうが、自分の馬を持ちたいだけであれば +そうではありません。 なので Horse クラスのクラスメソッドの内部の扱いを見てみましょう: { package Horse; @@ -1338,10 +1302,9 @@ =end original ここで私たちはクラスメソッドに戻っていることに注意してください; -また C<Horse::named> の2つの引数は C<Horse> および -C<Mr. Ed> になります。 -C<bless> 演算子は C<\$name> を bless するだけでなく、 -そのリファレンスを返します。 +また C<Horse::named> の2つの引数は C<Horse> および C<Mr. Ed> になります。 +C<bless> 演算子は C<\$name> を bless するだけでなく、そのリファレンスを +返します。 =begin original @@ -1349,8 +1312,7 @@ =end original -This C<Horse::named> method is called a "constructor". -(TBT) +この C<Horse::named> メソッドは「コンストラクタ」と呼ばれます。 =begin original @@ -1369,15 +1331,13 @@ ここではコンストラクタを C<named> としたので、このコンストラクタの引数が 特定の C<Horse> の名前ということを示しています。 -(家系や誕生日を記録するといった)違った方法でオブジェクトに -「命を吹き込む」別のコンストラクタには -また違った名前をつけることができます。 +(家系や誕生日を記録するといった)違った方法でオブジェクトに「命を吹き込む」 +別のコンストラクタにはまた違った名前をつけることができます。 しかし、もっと制限の課せられていた言語から Perl へと来たほとんどの人々は -C<new> という 1 つのコンストラクタに、様々な引数の処理方法を -加えて使います。 +C<new> という一つのコンストラクタに、様々な引数の処理方法を加えて使います。 どちらの方法でも、オブジェクトを作り出すあなたの特定のやり方をあなたが ドキュメント化している限りは問題ありません。 -(そしてそれを行ってI<きている>、そうですよね?) +(そしてそれを行って I<きている>、そうですよね?) =head2 Inheriting the constructor @@ -1393,8 +1353,8 @@ でもこのメソッドに C<Horse> 特有のことってありますか? 答えは No です。 -従って、C<Animal> から継承して何かを構築するのと -同じレシピを使うことができます; +従って、C<Animal> から継承して何かを構築するのと同じレシピを使うことが +できます; ここに C<name> と C<named> を置いてみましょう: { package Animal; @@ -1423,8 +1383,7 @@ =end original -あぁ、でもインスタンスに対して C<speak> を呼び出したら -どうなるのでしょう? +あぁ、でもインスタンスに対して C<speak> を呼び出したらどうなるのでしょう? my $horse = Horse->named("Mr. Ed"); $horse->speak; @@ -1435,7 +1394,7 @@ =end original -これはデバッグ情報になってしまいます: +これはデバッグ情報になります: a Horse=SCALAR(0xaca42ac) goes neigh! @@ -1451,9 +1410,8 @@ なぜこうなってしまうのでしょう? それは、この C<Animal::speak> ルーチンはその最初の引数には インスタンスではなくクラス名が来ると思っているからです。 -インスタンスが渡されるとブレスされたスカラリファレンスを -文字列として使うことになってしまい、それが先ほどみたものに -なってしまうのです。 +インスタンスが渡されるとブレスされたスカラリファレンスを文字列として +使うことになってしまい、それが先ほど見たものになってしまうのです。 =head2 Making a method work with either classes or instances @@ -1469,13 +1427,12 @@ =end original -今必要なことは、クラスに対して呼ばれたのか -それともインスタンスに対して呼ばれたのかを区別する方法です。 +今必要なことは、クラスに対して呼ばれたのかそれともインスタンスに対して +呼ばれたのかを区別する方法です。 一番率直な方法は C<ref> 演算子を使うことです。 これは bless されたリファレンスに対して使うと文字列(クラス名)を返し、 (クラス名のような)文字列に対して使うと空文字列を返します。 -ではまず変わったことがわかるように C<name> メソッドを -変更してみましょう。 +ではまず変わったことがわかるように C<name> メソッドを変更してみましょう。 sub name { my $either = shift; @@ -1491,11 +1448,11 @@ =end original -ここで C<?:> 演算子はでリファレンスするか派生された文字列かを -簡単に選択するために使っています。 +ここで C<?:> 演算子はでリファレンスするか派生された文字列かを簡単に +選択するために使っています。 さてこれでこのメソッドをインスタンスでもクラスでも使えるようにできました。 -最初のパラメータを保持する変数の名前を使う意図に合わせて -C<$either> に変更しています: +最初のパラメータを保持する変数の名前を使う意図に合わせて C<$either> に +変更しています: my $horse = Horse->named("Mr. Ed"); print Horse->name, "\n"; # prints "Any Horse\n" @@ -1521,8 +1478,8 @@ =end original -そして C<sound> は既にクラスでもインスタンスでも動作する -ようになっているので、これで完了です! +そして C<sound> は既にクラスでもインスタンスでも動作するように +なっているので、これで完了です! =head2 Adding parameters to a method @@ -1595,8 +1552,8 @@ =end original -パラメータを持ったインスタンスメソッドは、そのインスタンスと -パラメータのリストとともに呼び出されます。 +パラメータを持ったインスタンスメソッドは、そのインスタンスとパラメータの +リストとともに呼び出されます。 そのため最初の呼び出しは次のようになります: Animal::eat($horse, "hay"); @@ -1617,12 +1574,12 @@ =end original インスタンスにもっとデータがほしくなったらどうすればよいでしょう? -たいていの面白いインスタンスはそれぞれがリファレンスや -ほかのオブジェクトだったりする多くの要素で構成されています。 +たいていの面白いインスタンスはそれぞれがリファレンスや他の +オブジェクトだったりする多くの要素で構成されています。 これらを格納する一番簡単な方法はハッシュを使うことです。 ハッシュのキーはオブジェクトの部品(「インスタンス変数」若しくは -「メンバ変数」と呼ばれます)の名前として提供され、 -それに対応する値は、まぁ、その値です。 +「メンバ変数」と呼ばれます)の名前として提供され、それに対応する値は、まぁ、 +その値です。 =begin original @@ -1659,10 +1616,10 @@ =end original -これで C<< $bad->{Name} >> は C<Evil> になり、 -C<< $bad->{Color} >> は C<black> になります。 -でも C<< $bad->name >> でその名前にアクセスできるようにしたい -ですが、それはスカラリファレンスを前提にしているので台無しにされています。 +これで C<< $bad->{Name} >> は C<Evil> になり、C<< $bad->{Color} >> は +C<black> になります。 +でも C<< $bad->name >> でその名前にアクセスできるようにしたいですが、それは +スカラリファレンスを前提にしているので台無しにされています。 でも心配しないでください、これはとっても簡単に直ります。 =begin original @@ -1678,15 +1635,15 @@ =end original -One solution is to override C<Animal::name> and C<Animal::named> by -defining them anew in C<Sheep>, but then any methods added later to -C<Animal> might still mess up, and we'd have to override all of those -too. Therefore, it's never a good idea to define the data layout in a -way that's different from the data layout of the base classes. In fact, -it's a good idea to use blessed hash references in all cases. Also, this -is why it's important to have constructors do the low-level work. So, -let's redefine C<Animal>: -(TBT) +一つの解法は C<Sheep> で新しく定義することで C<Animal::name> と +C<Animal::named> をオーバーライドすることですが、後から C<Animal> に +追加されたメソッドではやはり混乱することになり、それらに全てについても +オーバーライドする必要があります。 +従って、基底クラスのデータ配置と異なるデータ配置を定義するのは決してよい +方法ではありません。 +実際、全ての場合で bless されたハッシュを使うのが良い考えです。 +また、これは低レベルの作業を行うコンストラクトが重要な理由です。 +それでは、C<Animal> を再定義しましょう: ## in Animal sub name { @@ -1707,9 +1664,8 @@ =end original -Of course, we still need to override C<named> in order to handle -constructing a C<Sheep> with a certain color: -(TBT) +もちろん、特定の色の C<Sheep> を構築するためにはまだ C<named> を +オーバーライドする必要があります: ## in Sheep sub named { @@ -1725,8 +1681,7 @@ =end original -(Note that C<@_> contains the parameters to C<named>.) -(TBT) +(C<@_> は C<named> への引数を含んでいることに注意してください。) =begin original @@ -1737,8 +1692,8 @@ =end original この C<default_color> って何でしょう? -C<named> が名前だけで呼ばれても色を設定する必要があります、 -そこでクラス毎にデフォルトの色を持てるようにしています。 +C<named> が名前だけで呼ばれても色を設定する必要があります; そこでクラス毎に +デフォルトの色を持てるようにしています。 羊には白を定義しておきましょう: ## in Sheep @@ -1750,8 +1705,7 @@ =end original -Now: -(TBT) +それでこれは: my $sheep = Sheep->named("Bad"); print $sheep->{Color}, "\n"; @@ -1762,8 +1716,7 @@ =end original -outputs: -(TBT) +以下を出力します: white @@ -1775,10 +1728,9 @@ =end original -Now, there's nothing particularly specific to C<Sheep> when it comes -to color, so let's remove C<Sheep::named> and implement C<Animal::named> -to handle color instead: -(TBT) +これで、色に関しては C<Sheep> に特有なことは何もなくなったので、 +C<Sheep::named> を削除して代わりに色を扱うために C<Animal::named> を +実装しましょう: ## in Animal sub named { @@ -1795,9 +1747,9 @@ =end original -そして追加したそれぞれのクラスで C<default_color> を定義する必要がないように、 -「デフォルトのデフォルト」を提供する -メソッドを C<Animal> で直接定義しておきます: +そして追加したそれぞれのクラスで C<default_color> を定義する必要が +ないように、「デフォルトのデフォルト」を提供するメソッドを C<Animal> で直接 +定義しておきます: ## in Animal sub default_color { "brown" } @@ -1811,8 +1763,8 @@ =end original もちろん、C<name> と C<named> だけがオブジェクトの「構造」を -参照していたので、残りのメソッドはそのままに -しておくことができます、C<speak> は前のままでそのまま動作します。 +参照していたので、残りのメソッドはそのままにしておくことができます; +C<speak> は前のままでそのまま動作します。 =head2 A horse of a different color @@ -1826,7 +1778,7 @@ =end original でも私たちの馬の全部が全部茶色では飽きてしまいます。 -なので色を取得/設定するためのメソッドを 1 つか 2 つ作ってみましょう。 +なので色を取得/設定するためのメソッドを一つか二つ作ってみましょう。 ## in Animal sub color { @@ -1846,8 +1798,7 @@ =end original 引数にアクセスするための別の方法に関する補足: -C<$_[0]> は C<shift> の代わりに in-place に -使うことができます。 +C<$_[0]> は C<shift> をせずにすぐにに使うことができます。 (これは頻繁に呼び出される箇所で時間を節約することができます。) さてこれで Mr. Ed の色を変えることができます: @@ -1881,13 +1832,11 @@ =end original -さて、これまでにクラスメソッド、コンストラクタ、 -インスタンスメソッド、インスタンスデータ、そして -アクセッサをも見てきました。 +さて、これまでにクラスメソッド、コンストラクタ、インスタンスメソッド、 +インスタンスデータ、そしてアクセッサをも見てきました。 しかしこれらは Perl の提供しているもののまだ始まりにすぎません。 -まだゲッター(getter)でありセッター(setter)でもある -アクセッサやデストラクタ、間接オブジェクト表記、 -オーバーロード、"isa" および "can" によるテスト、 +まだゲッター(getter)でありセッター(setter)でもあるアクセッサやデストラクタ、 +間接オブジェクト表記、オーバーロード、"isa" および "can" によるテスト、 C<UNIVERSAL> クラス、等々についてはまだ話し始めてもいません。 これらは他の Perl ドキュメントでカバーされています。 願わくば、これがあなたの一歩となりますように。 @@ -1920,9 +1869,9 @@ =end original -おもしろさを垣間見れるモジュールとして、 -Class::Accessor、Class::Class、Class::Contract, -Class::Data::Inheritable、Class::MethodMaker そして Tie::SecureHash。 +おもしろさを垣間見れるモジュールとして、Class::Accessor, Class::Class, +Class::Contract, Class::Data::Inheritable, Class::MethodMaker, +Tie::SecureHash。 =head1 COPYRIGHT @@ -1948,7 +1897,7 @@ Transrate: 山科 氷魚 (YAMASHINA Hio) <hio****@hio*****> Update: Kentaro Shirakata <argra****@ub32*****> (5.10.0-) -Status: in progress +Status: completed =end meta