ベアワード(文字列として扱われる)を使用するのではなく、クラス名を明示的に引用することは、構文のあいまいさを回避する3つの方法の1つです。perlobjドキュメンテーションの「クラスメソッドの呼び出し」セクションで説明しています。
Perlではパッケージ名とサブルーチン名にベアワードを使用できるため、ベアワードの意味が誤って解釈されることがあります。例えば、構築物は、Class->new()
いずれかのように解釈することができます'Class'->new()
かClass()->new()
.IN英語、第二の解釈として読み込むこと「という名前のサブルーチンを呼び出すClass()
場合、呼び出しnew()
の戻り値のメソッドとしてClass()
。」Class()
現在の名前空間で指定されたサブルーチンがある場合、Perlは常にClass->new()
2番目の代替として解釈します:への呼び出し
new()
によって返されたオブジェクトに対するへの呼び出しClass()
。
以下のデモで、この奇妙なケースの動作をご覧ください。
#! /usr/bin/env perl
use strict;
use warnings;
sub Type::Tiny { print "Returning Bogus\n" ; return "Bogus" }
sub Type::Tiny::new { print "Type::Tiny::new\n" }
sub Bogus::new { print "Bogus::new\n" }
my $class = "Type::Tiny";
Type::Tiny->new;
Type::Tiny::->new;
"Type::Tiny"->new;
$class->new;
その出力は
偽物を返す
偽:: new
タイプ:: Tiny :: new
タイプ:: Tiny :: new
タイプ:: Tiny :: new
前述のドキュメントセクションの残りの部分では、予期しない動作や不注意によるエラーから保護する方法を示します。
2つの方法で、Perlに最初の解釈を(つまり、というクラスのメソッド呼び出しとして)使用するように強制でき"Class"
ます。まず、::
クラス名にa を追加できます。
Class::->new()
Perlは常にこれをメソッド呼び出しとして解釈します。
または、クラス名を引用することもできます。
'Class'->new()
もちろん、クラス名がスカラーにある場合、Perlは正しいことも行います。
my $class = 'Class';
$class->new();
あなたの質問に適用すると、以下のすべての呼び出しは同等です。
Type::Tiny::->new( … );
"Type::Tiny"->new( … );
my $class = "Type::Tiny";
$class->new( … );
::
最後に追加すると、役立つ警告が表示されるという利点があります。誤って入力したとしましょう
Type::Tinny::->new;
それが生み出す
ベアワード "Type :: Tinny ::"は、。/ try行15に存在しないパッケージを参照しています。
./try行15で、パッケージ "Type :: Tinny"を介してオブジェクトメソッド "new"を見つけることができません( "Type :: Tinny"の読み込みを忘れた可能性があります)。
Foo::->new
、池上から学んだように。