문자열로 취급되는 베어 워드를 사용하지 않고 클래스 이름을 명시 적으로 인용하는 것은 구문 상 모호성을 피하는 세 가지 방법 중 하나입니다. perlobj 문서 의 호출 클래스 메소드 섹션에 설명되어 있습니다.
Perl에서는 패키지 이름 및 서브 루틴 이름에 베어 워드를 사용할 수 있으므로 베어 워드의 의미를 잘못 해석하는 경우가 있습니다. 예를 들어, 구문 Class->new()
은 'Class'->new()
또는 으로 해석 될 수 있습니다 Class()->new()
. 영어에서 두 번째 해석은 "라는 서브 루틴 Class()
을 호출 한 다음 new()
반환 값에 대한 메소드 로 호출 "로 읽습니다 Class()
. Class()
현재 네임 스페이스에 이름이 지정된 서브 루틴이있는 경우 Perl은 항상 Class->new()
두 번째 대안, 즉에 대한 호출에 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;
출력은
돌아 오는 가짜
가짜 :: 새로운
유형 :: 작은 :: 새로운
유형 :: 작은 :: 새로운
유형 :: 작은 :: 새로운
앞에서 언급 한 나머지 문서 섹션에서는 놀라운 동작이나 실수로 인한 오류를 방지하는 방법을 보여줍니다.
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;
그 생산
Bareword "Type :: Tinny ::"는 ./try 15 행에 존재하지 않는 패키지를 나타냅니다.
./try 15 행에서 "Type :: Tinny"패키지를 통해 "new"객체 메소드를 찾을 수 없습니다 ( "Type :: Tinny"를로드하지 않았습니까?).
Foo::->new
, 이케 가미에서 배운대로.