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);
---

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2009/08/10 19:29:32
  • 終了:2009/08/17 18:57:35

ベストアンサー

id:otsune No.3

otsune回答回数35ベストアンサー獲得回数52009/08/12 23:04:22

ポイント100pt

perl -MO=Deparse *.pl

すればどちらも

>|perl|

use YAML;

print Dump('Hoge'->new);

print Dump('Hoge'->new);

||<

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

id:taichino0730

otsune様

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

これは一目瞭然ですね!

print Dump new Hoge;と

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

--

print Dump('Hoge'->new);

print 'Hoge'->Dump->new;

--

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

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

2009/08/17 18:56:46

その他の回答(2件)

id:yofukaci No.1

yofukaci回答回数306ベストアンサー獲得回数102009/08/10 21:52:30

ポイント25pt

同じ。

書き方の趣味の問題。

id:taichino0730

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

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

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

---

use YAML;

use Hoge;

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

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

---

追記. 2009/8/17

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

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

失礼致しました。

2009/08/17 18:36:12
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402009/08/11 08:47:29

ポイント50pt

同じです。

perlobj - Perl のオブジェクト

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

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


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

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

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

id:taichino0730

b-wind様

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

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

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

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

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

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

2009/08/17 18:36:26
id:otsune No.3

otsune回答回数35ベストアンサー獲得回数52009/08/12 23:04:22ここでベストアンサー

ポイント100pt

perl -MO=Deparse *.pl

すればどちらも

>|perl|

use YAML;

print Dump('Hoge'->new);

print Dump('Hoge'->new);

||<

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

id:taichino0730

otsune様

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

これは一目瞭然ですね!

print Dump new Hoge;と

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

--

print Dump('Hoge'->new);

print 'Hoge'->Dump->new;

--

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

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

2009/08/17 18:56:46

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません