人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlのインスタンス作成時の、new HogeとHoge->newの違いを教えて下さい。
できれば挙動の違いが確認できるソースコードも一緒に教えて頂けるとありがたいです。

何となく渡される引数が違うのかと思い、以下のコードで両方のnewで試してみたのですが、
挙動の違いを確認できませんでした。
---
package Hoge;
sub new {
print @_, "\n"; # 引数を確認
my $class = shift;
my $self = bless {
}, $class;
return $self;
}
1;

__END__;

use YAML;
print Dump(new Hoge); # どちらも同じ出力
print Dump(Hoge->new);
---

よろしくお願いします。

●質問者: taichino
●カテゴリ:コンピュータ
✍キーワード:Class dump hoge Perl print
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● yofukaci
●25ポイント

同じ。

書き方の趣味の問題。

◎質問者からの返答

同じではないと感じています。例えば質問内のHogeクラスに対して以下のようなコードを書くと、

new Hogeはエラー、Hoge->newはOKとなります(恐らく評価順が違う)。

その為、評価順が違うという事は単なるシンタックスシュガーではないのでは?と考えています。

---

use YAML;

use Hoge;

print Dump new Hoge; # この行はエラー

print Dump Hoge->new; # この行はOK

---

追記. 2009/8/17

すいません、僕の認識が間違っておりました。

2つの書き方について、想定する動作は同じだという事を理解しました。

失礼致しました。


2 ● b-wind
●50ポイント

同じです。

perlobj - Perl のオブジェクト

歴史的、あるいはその他の様々な理由によって、Perl はメソッド呼び出しを書くための、二つの等価な方法を提供しています。より単純でより一般的な方法は矢印記法を使うことです:

上記URLの「Method Invocation invocation method arrow ->」と「Indirect Object Syntax indirect object syntax invocation, indirect indirect」を参照してください。


new Hogeはエラー、Hoge->newはOKとなります(恐らく評価順が違う)。

その通り、評価順によって予想とは異なる結果になる事もあります。

しかし、それはあなたがそう書いたからであって呼び出されてしまえば挙動は同じです。

◎質問者からの返答

b-wind様

ご回答ありがとうございます。

perldocを見れば良かったのですね。

2つの書き方について、想定する動作が同じである事と、

new Hoge(間接オブジェクト構文)には幾つかデメリットがある事を理解できました。

以降は、Hoge->newで統一していこうと思います。

ありがとうございました!


3 ● otsune
●100ポイント ベストアンサー

perl -MO=Deparse *.pl

すればどちらも

>|perl|

use YAML;

print Dump('Hoge'->new);

print Dump('Hoge'->new);

||<

と同じ結果にパースされているのがわかります。つまりどちらの記法でもやっていることは同じですね。

◎質問者からの返答

otsune様

ご回答ありがとうございます!

これは一目瞭然ですね!

print Dump new Hoge;と

print Dump Hoge->newでこのコマンドを試してみると、以下のようになりました。納得です。

--

print Dump('Hoge'->new);

print 'Hoge'->Dump->new;

--

恥ずかしながらMOオプションDeparseも知りませんでした。勉強になりました。

ありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ