2008-06-05

[][]Moose?Mooseってなんだ?あれか?整髪料か?え?Perl

最近Perl界隈ではMoose、MooseってなんかMooseってのが流行ってるらしい。

もう完全に出遅れてしまったので増田で書き殴ってみる。

自分自身のブログでは、さもずっと前からMoose知ってたかのように振舞うために、増田で先に放出しておく。てへへ。

プログラマ層が限りなく低い増田にこんなこと書いてもだれも見てくれない気はするけど。

初めてのMoose - Mooseのすすめ - はてな#hide-k

初めてのMoose

meta object protocol について考えてみる - TokuLog 改めChumbyとどきました日記

YappoLogs: Moose のコードを探索して理解を深めた

Mooseってのは結局のところClass::MOPのラッパーみたいなもんだと。

で、Class::MOPってのは何だ?ってことだけど、メタなんとかプログラミング?え?プロトコル?まーどっちでもいい。

よくよく読んでいくとメタなんとかとか大層な名前が付いてるけど、結局のところPerlのpackageそのものの操作をオブジェクティブ扱えるようにしたものみたいだ。

つまりだな、例えばpackageに対して動的に(静的ではなく!)メソッドを追加したい場合、今までなら


package Foo;

**Foo::method = sub {
	return 'hoge';
};

print Foo->method;

のように型グロブに関数リファレンスを突っ込むということをしなければなかったが


use Class::MOP;

my $class = Class::MOP::Class->create('Foo');

$class->add_method('method',sub {
	return 'hoge';
});

print Foo->method;

みたいな感じでかっこよく追加できるってわけさ。ま、これはほんの一例だけどな。(他にもメソッドを削除したりフックしたり色々できる。その辺は今回省略。)

本来なら「package Foo」とするところを「my $class = Class::MOP::Class->create('Foo');」と書ける。

これの何が良いのかというと、$classというオブジェクト経由でFooパッケージを色々操作できるところにつきる。

型グロブを使用したり「no (warnings|strict)」をしたりパッケージを操作する処理っていうのはPerlのキチャナイ構文が多かったのだが、Class::MOPのおかげでスッキリ綺麗に書けるようになったってこった。

で、次にMooseだが、これは結局のところClass::MOPのパッケージ管理の部分に+αしただけのラッパーだ。

でもその+αってのが結構凄かったりする。

もうこの辺の話はさんざん既出だが、例えばhasという関数を使ってアクセサや型定義が出来たり


package Foo;
use Moose;

has 'method' => ( is => 'rw', isa => 'Int' , default => '10' );

my $obj = Foo->new;

print $obj->method;   # 10

$obj->method(50);

print $obj->method; # 50

$obj->method('hoge') # Int型じゃないのでエラー

Moose::Roleを使ってRubyのMixinみたいなことができたりする。

でも実はこれらの処理ってのは本当は別に凄くもなんとも無い。

アクセサ生成なんてClass::Accessorがあるし、関数引数の型チェックなんてのもParams::Validate等昔から存在してるし、Mixinに関してはもともとPerlは多重継承できるので最初からできるし。

じゃあなんでみんなMoose、Moose言ってるのかっていうと、それはやはりClass::MOPの存在が大きいであろう。

綺麗且つ柔軟にパッケージの操作が出来るClass::MOPが土台にあって、今まで別々の役割として存在してきたモジュール達を統合し、よりわかりやすく、より柔軟に、そしてより強力なPerlオブジェクト指向を構築できるようにした。それがMooseなのだ。



・・・しかし、小生。

Mooseについて調べていくうちに一つ残念に思ったことがある。

オブジェクトにメソッドを追加する機構がないのだ。

オブジェクトにメソッドを追加する、だ。パッケージにではなく、オブジェクトに、だ。

具体例をあげる。


package Foo;
use Moose;

my $obj = Foo->new;
$obj->meta->add_method('hoge', sub { return 'hoge' });

print $obj->hoge; # hoge

ちなみに$obj->metaというのはFooパッケージを管理するClass::MOPへのアクセサだ。

ということは上記の処理はFooに対してhogeというメソッドを追加していることになる。

では次の例。


package Foo;
use Moose;

my $obj = Foo->new;
$obj->meta->add_method('hoge', sub { return 'hoge' });

print $obj->hoge; # hoge

my $obj_2 = Foo->new;
print $obj_2->hoge; # hoge

$obj_2->hogeが呼べてしまうわけだ。

$obj->metaは結局のところFooパッケージなのだから、そこにメソッドを追加しているので当然の結果である。

$objだけにメソッドを追加することは、Mooseではできないのだ。

非常に残念である。ああ、残念だ。




・・・しかし、小生。

これでもプログラマの端くれである。こんなことでめげていてはMooserを名乗れないのである。(あ、MooserってのはMoose使いの人の俗称ね。今僕が考えたの)

なのでオブジェクトにメソッドを追加できるように拡張して見せよう。


package Foo;
use Moose;

use Class::Object;
my $class_object = Class::Object->can('new');
override new => sub { ref($class_object->(shift))->SUPER::new(@_) };

my $obj = Foo->new;
$obj->meta->add_method('hoge', sub { return 'hoge' });

print $obj->hoge; # hoge

my $obj_2 = Foo->new;
print $obj_2->hoge; # エラー

たった3行追加するだけで実現できる。さすがMoose。

ただし、Class::Objectを利用しているのでFoo->newで返ってくるパッケージがFoo::0といったようにFooではなくなってしまっているのでrefとかでパッケージ名の比較ができなくなってしまう問題が発生する。

でもこれも継承順をいじったりと本気で頑張れば、表向きに見せるパッケージ名をFooすることも可能だろう。

その添削の役目はどこかのハッカーに任せるとして、今日のところはこの辺で終了としたい。

Moooooooooooooose!と叫ぶのが流行ってるみたいなので、もっとも長くMooooooooooooooose!と叫んだ最初の男となるべく下記の処理を残しておく。


length q chdir uc and print chr ord uc q rmdir and do { print chr ord q xor x while $a++ < 0xffffffff } or print chr ord qw q sin q and print chr ord q ne sin and print chr hex length q q shift shmread bless q;





プログラ増田のあなぐら

記事への反応 -
  • 40行で作るPerl用テンプレートエンジン PerlのClass::Data::Inheritableの解析 [perl]「,」と「=&gt;」の違いについて [perl]内部的に数値か文字かを判別する Shift_JISにおける危険な文字まとめ [perl...

    • 結論→一緒。 すまん嘘。 ほぼ同じ意味だって言いたかったの。カンマもイコールダイナリもほとんど同じ感覚で使用できる。 唯一つ違うのはイコールダイナリの左辺に置いた文字列は...

    • どうーでもいいーですよー。 どうでもいい話ー、聞いてください。 Perlというやつは一応内部的には数値か文字列かをちゃんと分けて変数の管理をしているのです。 でわ、現在ある変...

    • 今時Shift_JISでプログラミングするバカな奴はいないだろうけど折角まとめたので公開 2バイト目がアスキーコードど丸被りしているものを列挙する @ [ \ ] ^ _ ` { &#124; }...

      • 私は単なる一増田でしかないのだが、なんとなく今日を増田的情報セキュリティの日とすることに決めた。 なぜって、今日は、年末年始という忙しく、そして狙われやすい時期をはさみ...

      • Shift_JISにおける危険な文字まとめ 携帯サイトをUTF-8で出力するかShift_JISで出力するか - F.Ko-Jiの「一秒後は未来」

    • autoboxが流行ってるのになんで誰もコレを作らないのか不思議遊戯 package autobox::Unix;sub SCALAR::rm { my $dir = shift; my $option = shift; `rm $option $dir`;}# etc・・・use autobox;use autobox::Core;use autobox...

    • function qw ($str) { return preg_split(&#39;/&#92;s+/&#39;,$str,-1,PREG_SPLIT_NO_EMPTY);}$data = qw(&#39; hoge muge dae&#39;);print_r($data); にゃろめ。 プログラ増田のあなぐら

    • そろそろ FizzBuzz に飽きた - にぽたん研究所 NabeAtzzが空前のブームということで俺もRubyで書いてみた。 list = %W/さん ろく きゅう じゅうに じゅうさん じゅうご じゅうはち にじゅういち ...

    • フレームワークとか使ってるともはや隠蔽されすぎて自分で実装しようなんて思わないのが普通である。 ましてや車輪の再開発などもってのほか、バグを生み出す温床にしかならない。 ...

      • ブコメの。 さそりアーマーに殺される夢を見た増田 俺はさそりアーマーに殺される夢を見たな 80年代女性アイドル論の増田 マスダ80年代女性アイドル論~総論 おまえは今まで食っ...

    • 唐突にClass::Data::Inheritableのソースコードについて説明してやんよ。 使い方とかの説明はこの辺でも読んでから出直して来い、ごるぁ! まぁとりあえずソース見てみろ、下記にはっつけ...

    • 4Uって知ってるかい? http://4u.straightline.jp/ ”世界中の美女画像を皆でシェアするソーシャルイメージブックマークサービス” とのことさ。それはほんともう美しい画像が満載で毎日見...

      • これのおかげで画像ファイルがとうとう8,000個(1GB!)を超えてしまい、どうしたものかと思っていたところ、いいものを発見。 Vredefort(フレデフォート) いわゆるデジタルフォトフレーム。SON...

        • おー、使ってくれてる奇特な奴がいるとはうれしいねぇ。 感謝の気持ちを込めて実はアレから少しバージョンアップしてるのでそれを公開しますよ! 改善点は2点。 終了判定の変更 ...

          • バージョンアップ、キタ━━━━━━(゜∀゜)━━━━━━ !!!!! [明日ためす]

          • スーパーpre記法がアレなまま直ってないわけで。 姉妹サイト(?)ができていたわけで。 なにやらcookieを食べようとした形跡があるわけで。 #!/usr/local/bin/perl -wuse strict;use warnings;use Web::Scraper...

    • おれはもうMooseしかつかわねぇ。後にも先にもMooseMooseMooseMooseMoose!!!!!!!!!!!1111111 ってな人の為にいつでもどこでもMooseする。automooseを実装しますた。 package automoose;use stric...

    • 例えば下記の擬似コード i = 1; while( i &#38; 7 ) { i++; } 勘弁して。いや、わかるよ。言いたいことはさ。でも俺こういう書き方慣れてないから脳内で素早く2進数変換できないの。 いや単...

    • つまり下記のような書き方をした場合の話 [http://anond.hatelabo.jp/0000000:title=あああテスト] キーワードがリンクされてしまってうまくリンク名として認識されない。 詳しくはこの記事を読...

    • if ("0x0A" == "10") { print '(´ε` )チュッ';} チュッ。されちゃいます。 文字列であっても整数と解釈できる文字列の場合は勝手に型変換しやがる今世紀最大の愚行を犯してしまうっての...

      • 興味深い。できたらblogでやってほしいところ。 増田だと流れちまうからなあ。

      • プログラミングのこういう細かいところが死ぬほど嫌い。発狂するほど嫌い。 文字コードとかマジクソが死ねよって感じ。 こういうののせいでいつまでたってもプログラミングが好きに...

        • PHPみたいな糞とまともなプログラミング言語を一緒にするなよw 文字コードについては言語レベルではどうにもならんことはあるが、他の言語での扱いは少なくともPHPよりは楽。 バッド...

          • PHPに限らず、CとかC++もめんどくせーこと多くて嫌いなんだよ…。 あ、C/C++もまともな言語じゃないっすか。そうっすか…。

            • C/C++はあくまでもCPU依存性を減らしたアセンブラであって、面倒くささを耐える代わりに速度を稼ぐという特殊用途言語なんだから、「プログラミングは面倒だ」というには局所的すぎる...

              • バッドノウハウ…! これですよ。こういうのがマジウザい。 何がバッドノウハウだよただ仕様が終わってるだけじゃねーかカスが!って思う。 ああいうクソ仕様素晴らしい仕様をいか...

                • バッドノウハウってのはかっこつけた単語じゃなくて、奥が深い症候群を戒めた語だよ。 自分が知ってる「業界の雰囲気」ってのが偏ったものだと知覚した方がいい。 それが相応しい...

                  • 職務的にはC++が適してるから使ってるんだなあこれがまた。 業務系SEやってる友達と話したときはC++wwwねえよwwwせめてC#にしとけwwwって感じだったけど。 業務系システムはプログラミン...

            • C・C++の面倒くさいことって具体的に何? 自分は仕VB・C・C++しか使ったことないが、面倒くさいと思ったことない。 他の言語ってそんなに楽なんだろうか?

              • その経歴なら是非スクリプト言語を使ってみることを勧める。 Ruby, Perl, Pythonのうち1つは覚えた方がいい。絶対役に立つよ。 一昔前ならPerlを進めてたところだけど、今ならRubyかな。 ht...

              • 型。状況や文脈を判断してよきに計らってほしい。 ポインタ。と言うよりメモリ管理か。必要に応じて増やすなり減らすなりよきに計らってほしい。

              • めんどくせーめんどくせー言ってる増田だけど。 C/C++はまずガベージコレクタが無いのがめんどくさすぎる。いちいちライブラリ導入したりboostのスマートポインタ使ったりしなきゃいけ...

                • 適材適所 sed ちょっとした正規表現抜き出しに perl そこそこの文書処理に Java わりと何でもいけるが、わりと平均的にめんどくさい JSP メモリ64K制限さえなければすばらしかったが、Ja...

      • PHPで一番困るのは、この手の変換が直感的でも統一的でもなことだな。 「自分が何をしようとしているのか」が素直に書けないんだよね。 言語として元になっているPerlにも文字と数値...

      • PHPの「==」は「数値として比較する」ためのものであって、そもそも文字列として比較するときに使うためのものではないという説。 文字列比較を意図するのであれば、 if (strcmp(&quot;0x0A...

        • 文字列比較を意図するのであれば、 if (strcmp("0x0A", "10")) { print '(´ε` )チュッ';} とすべき。当然チュッされない。 strcmp()は文字列が等しいときに0になるから、これだとチュッされ...

        • そこの増田よ。 strcmpの使い方を間違っておられる。 さっと手元で書いたから間違えたのならまだいいが、いつもその書き方をしてるのなら君書いたプログラムには重大なバグが潜んで...

      • ===演算子を使えよ if ("0x0A" === "10") { print '(´ε` )チュッ';}else{ print '\(^o^)/';} \(^o^)/ ==演算子は方をキャストしながら、ほぼ同じなら同じと見なせという意味。 HTMLとかで曖昧に...

        • 自己レス 012とかは、よく桁のパディングで 000001 と 1が同じであることを見つけるとかって処理をするから、8進数と見なしてくれるより、10進数で0詰めって見なしてくれた方が、テキ...

        • もちつけ。 ===演算子を使うなとは書いてないし、8進数使いたいとも書いてない。 元記事はただ事実をありのまま書いているだけだ。 そして誰も「つのだ★ひろ」には突っ込まないw

          • えー、PHPの世界ではそういうときは===をつかうってなってるのに・・・ わざわざ==を使って 他の言語の規則を持ってきてどうのこうの言って===に触れないってのは、ちょっと意地悪い...

            • ===なんていう意味不明な変態演算子をわざわざ使わなきゃいけない言語なんて…。 まぁPHPさわったことないけど。

            • String型同士の比較であっても整数と解釈される文字列の場合は整数に変換される。 この仕様は知っていたが、まさか0x0Aという文字列が、普通にキャストした場合は0にしかならないのに...

              • もともと if("0x0a" == 10){ } を成り立たせた方が都合がよい。というのの応用で "0x0a" == 10 == "10" となるだけだからねぇ。 if ("0x0A" == 0x0A) { print '(´ε` )チュッ';}else{ print '\(^o^)/';} は'(...

      • PHPコーディング規約  http://www.sksk.info/php.html 404 Blog Not Found:そろそろPHPに関して一言いっとくか  http://blog.livedoor.jp/dankogai/archives/50835571.html 404 Blog Not Found:「PHPなめんな」と「(Perl|Pytho...

        • こうやって並べてみると PHP(C/Java/Ruby/Python好きな物に置換可能)は、良い・悪いの議論って、 本当に、隣の葡萄はすっぱい。俺のレモンは甘い 議論なんだなぁと。

      • プログラミング言語ヒエラルキーにおける罵倒 http://anond.hatelabo.jp/20070502200124 phpのいやなところ / perlのいやなところ http://anond.hatelabo.jp/20070522174725 LL編プログラミング言語ヒエラルキーに...

    • 元ネタ http://phpspot.org/blog/archives/2009/12/phpjavascriptph_1.html 面白そうだと思ったので僕もやってみた。モジュールはPerl5.8系の標準モジュールのみ利用可という制限。 全部はキツイので関数...

    • ひーほー。いやぁさてさて一体このコード中に何度create_functionで匿名関数が生成されたのかふと気になったあなたのためにこんな関数を作ってみたよ! function get_lambda_functions () { $i ...

    • を作ってみた。 うたまっぷ javascript:(function(){%20var%20t;%20var%20d=document;%20var%20h=new%20XMLHttpRequest();%20var%20r=d.location.href.match(/surl=([A-Za-z0-9]+)/);%20h.open('GET','phpflash/flashfalsephp.php?unum=?'+r[1],true);%2...

    • &#82;&#117;&#98;&#121;&#12391;&#12358;&#12393;&#12435;&#12370;&#81;&#117;&#105;&#110;&#101;&#40;&#12392;&#65;&#65;&#22411;&#81;&#117;&#105;&#110;&#101;&#12398;&#20316;&#12426;&#26041;&#35611;&#24231;&#41; &#112;&#101;&#114;&#108;&#32;&#45;&#32;&#81;&#...

    • 以下の記事を読んだ私は違和感を覚えた。 &#31169;&#12364;&#12477;&#12501;&#12488;&#12454;&#12455;&#12450;&#25216;&#34899;&#32773;&#12434;&#12420;&#12417;&#12383;&#29702;&#30001; 今時のソフトウェア技術者というものは...

      • sqlとかでisdateしてやれば済むお話しさー。 最初の要件定義にうるう年について書かれていなければ、うるうどしが来たらうるう年対応でお金をもらえばいいじゃない。 というより、綺麗...

        • 超人が500行で1時間で書いたスマートなプログラムよりも、凡人が10000行、1カ月かけてつくったプログラムのほうがお金にはなるんだ。 マジレスすると、上記の条件であれば、案件...

    • http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/ 良いPHPerだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。 つまり...

      • ペロペロ 1. htmlのはき出しがあるやつは?&gt;を書いたほうがいいよ。それ以外は最近はかないのがはやりだねさらに昔はevalとかで書いてた 2. configこれはwwwやpublic_html以下にしかconfigを配...

      • 21. 分散SCMを使え なにはともあれまずはコミットだ 粒度だクソだはpushするときにかんがえろ 1コミットで合わせて全然関係ない別の場所を変更したおまえは死刑だ

    • http://anond.hatelabo.jp/20130322031333 プログラミング出来る方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。 こんなタイトルに...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

      • http://anond.hatelabo.jp/20130322202542 コレ見て書いてみたくなっただけ。 英語が話せるようになる方法教えるだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん