CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: http://kohada.2ch.net/php/)
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
荒らしはスルー推奨。
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、
Perlの奥深さについて皆で語り合い、追求してまいりましょう。
www.perl.org/get.html
Download Latest Stable Source (5.18.2)
▼前スレ
Perlについての質問箱 61箱目
http://toro.2ch.net/test/read.cgi/tech/1381561905/
Perlについての質問箱 62箱目
http://toro.2ch.net/test/read.cgi/tech/1385039352/
探検
Perlについての質問箱 63箱目
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2014/02/19(水) 23:36:23.292016/02/16(火) 07:29:00.22ID:y+ZjOqCo
いきなりだけどPerlのクラスの仕組み(かなり手抜き)
+ JavaScript の質問用スレッド vol.128 +©2ch.net
http://peace.2ch.net/test/read.cgi/hp/1454390682/401- のJavaScriptのthisの話の余談
大雑把に言うとPerlのクラス(オブジェクト)はハッシュに毛が生えたもの
※この段階ではクラスではない。ただのハッシュを返すnew関数とそれを入れたKlassパッケージ
package Klass;
sub new { return {a=>1, b=>2 } }
sub foo {}
Perlにはメソッドというものはない。全て関数。
コンストラクタ(一般的にnewという名前にする)もただの関数。
Perlではクラスやオブジェクトはこのようにして呼び出す。
my $obj = Klass->new();
$obj->foo();
ここで問題がある。$obj->foo()は、Klass::foo()を呼び出すことになるが、
$obj(ただのハッシュ)からどうやってKlass::foo()であることを知るのか?
ただのハッシュを返しているだけのnew関数にはそれは無理なので
ただのハッシュに毛を生やす。
sub new { return bless({a=>1, b=>2 }, 'Klass') }
これでただのハッシュじゃなくてKlassという情報がくっついたハッシュになった。
これで$obj->foo()はKlass::foo()を呼び出せる。
+ JavaScript の質問用スレッド vol.128 +©2ch.net
http://peace.2ch.net/test/read.cgi/hp/1454390682/401- のJavaScriptのthisの話の余談
大雑把に言うとPerlのクラス(オブジェクト)はハッシュに毛が生えたもの
※この段階ではクラスではない。ただのハッシュを返すnew関数とそれを入れたKlassパッケージ
package Klass;
sub new { return {a=>1, b=>2 } }
sub foo {}
Perlにはメソッドというものはない。全て関数。
コンストラクタ(一般的にnewという名前にする)もただの関数。
Perlではクラスやオブジェクトはこのようにして呼び出す。
my $obj = Klass->new();
$obj->foo();
ここで問題がある。$obj->foo()は、Klass::foo()を呼び出すことになるが、
$obj(ただのハッシュ)からどうやってKlass::foo()であることを知るのか?
ただのハッシュを返しているだけのnew関数にはそれは無理なので
ただのハッシュに毛を生やす。
sub new { return bless({a=>1, b=>2 }, 'Klass') }
これでただのハッシュじゃなくてKlassという情報がくっついたハッシュになった。
これで$obj->foo()はKlass::foo()を呼び出せる。
2016/02/16(火) 07:29:53.95ID:y+ZjOqCo
ここからが面白くて「アローの左側は関数の第一引数になる」というルールを追加する。
そうすると、Klass->new() という呼び出しは、 new('Klass') 相当になることがわかる。
ということで、newの第一引数にはクラスの文字列が入ってくるのでそれを使える。
sub new { my $class = shift; return bless({a=>1, b=>2 }, $class }
さらに、$obj->foo() の呼出も同じ。 foo($obj) 相当になる。
なので、sub foo { my $self = shift; } の$selfにはnewの戻り値である
毛が生えたハッシュ、つまりオブジェクト自身(他の言語のthis相当)が入ってくることになる。
このようにアローの左側が第一引数になる。という挙動は他の言語でも一緒で
JavaやC++は内部的にそれを行ってるだけ。
そしてJavaScriptでも.(ドット)の左側が第一引数になると考えると、
JavaScriptのthisがよくわからんという問題も簡単に理解できるはず。
JavaScriptのthisの話は元スレへどうぞ
そうすると、Klass->new() という呼び出しは、 new('Klass') 相当になることがわかる。
ということで、newの第一引数にはクラスの文字列が入ってくるのでそれを使える。
sub new { my $class = shift; return bless({a=>1, b=>2 }, $class }
さらに、$obj->foo() の呼出も同じ。 foo($obj) 相当になる。
なので、sub foo { my $self = shift; } の$selfにはnewの戻り値である
毛が生えたハッシュ、つまりオブジェクト自身(他の言語のthis相当)が入ってくることになる。
このようにアローの左側が第一引数になる。という挙動は他の言語でも一緒で
JavaやC++は内部的にそれを行ってるだけ。
そしてJavaScriptでも.(ドット)の左側が第一引数になると考えると、
JavaScriptのthisがよくわからんという問題も簡単に理解できるはず。
JavaScriptのthisの話は元スレへどうぞ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 10月実質賃金、0.7%減 マイナス10カ月連続 [少考さん★]
- 中国軍、レーダー照射巡り反論 「日本の自衛隊機が安全脅かした」 ★5 [蚤の市★]
- 【ゲーム】大幅値下げの「PlayStation5」は大ヒット中の「Switch2」に勝てるのか? ★2 [樽悶★]
- 【おこめ券】鈴木憲和農水相肝いり「おこめ券」に自治体反発 物価高対策も配布の経費、手間多く [ぐれ★]
- 沖縄周辺で空母から発着100回 6、7日に中国「遼寧」の艦載機 日本政府が中国側に抗議 [ぐれ★]
- 【元TOKIO】松岡昌宏&城島茂が「鉄腕DASH」から卒業の可能性 日テレへの〝踏み込んだ〟発言が波紋 [Ailuropoda melanoleuca★]
- 日本人「日本のネコ型配膳ロボットが世界中で活躍して誇らしい😤!!モラルの低い中国じゃ無理😂wwwwww」 [441660812]
- ワイボーナス150万取られる税金に絶望😭 [218488394]
- 高市さん、レーダー照射を受けてアメリカに強力な支援を要請したが全く相手にされなかったと暴露されるwww [709039863]
- のあ先輩って誰?
- 中国人が正論「高市が中国に対して強気なのは核を使わないと思ってるから。いちど核を使ってみて「わからせる」必要がある」 [177178129]
- 毒親あるある
