[過去ログ]
Perlについての質問箱 63箱目 (1002レス)
Perlについての質問箱 63箱目 http://mevius.5ch.net/test/read.cgi/tech/1392820583/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
67: デフォルトの名無しさん [sage] 2016/02/16(火) 07:29:00.22 ID: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()を呼び出せる。 http://mevius.5ch.net/test/read.cgi/tech/1392820583/67
68: デフォルトの名無しさん [sage] 2016/02/16(火) 07:29:53.95 ID: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の話は元スレへどうぞ http://mevius.5ch.net/test/read.cgi/tech/1392820583/68
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.197s*