できれば挙動の違いが確認できるソースコードも一緒に教えて頂けるとありがたいです。
何となく渡される引数が違うのかと思い、以下のコードで両方の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);
---
よろしくお願いします。
perl -MO=Deparse *.pl
すればどちらも
>|perl|
use YAML;
print Dump('Hoge'->new);
print Dump('Hoge'->new);
||<
と同じ結果にパースされているのがわかります。つまりどちらの記法でもやっていることは同じですね。
同じ。
書き方の趣味の問題。
同じではないと感じています。例えば質問内のHogeクラスに対して以下のようなコードを書くと、
new Hogeはエラー、Hoge->newはOKとなります(恐らく評価順が違う)。
その為、評価順が違うという事は単なるシンタックスシュガーではないのでは?と考えています。
---
use YAML;
use Hoge;
print Dump new Hoge; # この行はエラー
print Dump Hoge->new; # この行はOK
---
追記. 2009/8/17
すいません、僕の認識が間違っておりました。
2つの書き方について、想定する動作は同じだという事を理解しました。
失礼致しました。
同じです。
歴史的、あるいはその他の様々な理由によって、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で統一していこうと思います。
ありがとうございました!
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も知りませんでした。勉強になりました。
ありがとうございました!