이 코드의 두 버전 모두 -C Perl 검사에 실패하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2255495

  •  20-09-2019
  •  | 
  •  

문제

그만큼 new 의 방법 Parse::RecDescent 이 프로토 타입이 있습니다.

sub new ($$$)
{
   # code goes here
}

그리고 다음과 같은 객체를 만들면 다음과 같습니다.

my $parser = Parse::RecDescent->new($grammar);

파서가 생성되며 메소드는 2 개의 매개 변수 "Parse :: Redescent"및 $ 문법을 받게됩니다. 다음과 같은 객체를 만들려고한다면

Parse::RecDescent::new("Parse::RecDescent",$grammar)

이것은 "Parse :: Redescent :: New에 대한 충분한 논증이 없다"고 말하며이 메시지를 이해합니다. 나는 단지 2 개의 매개 변수를 전달합니다. 그러나 화살표 버전이 왜 작동하는지 이해하지 못합니다.

설명 할 수 있습니까?

도움이 되었습니까?

해결책

기능 프로토 타입은 OO 스타일 방법이라고 부를 때 확인되지 않습니다. 또한, 당신은 &와 같이 서브를 호출 할 때 프로토 타입 확인을 우회합니다. &sub(arg0, arg1..);

에서 Perldoc Perlsub:

"&"양식은 인수 목록을 선택적으로 만들뿐만 아니라 제공하는 인수에 대한 프로토 타입 확인을 비활성화합니다. 이것은 부분적으로 역사적 이유이며, 부분적으로는 당신이하고있는 일을 알고 있다면 부정 행위를하는 편리한 방법을 갖기위한 것입니다. 아래 프로토 타입을 참조하십시오.

메소드 호출은 프로토 타입의 영향을받지 않습니다. 호출되는 기능은 컴파일 시간에 불확실하기 때문에, 정확한 코드는 상속에 의존하기 때문입니다.

하는 동안 Parse::RecDescent::new("Parse::RecDescent", $grammar) 구문 적으로 정확합니다. 그것은 생성자를 부르는 매우 냄새 나는 방법이며, 이제는 조상이 아닌 해당 클래스에서 정의되도록 강요하고 있습니다. 실제로 인수를 검증 해야하는 경우 방법 내부에서 수행하십시오.

sub new
{
    my ($class, @args) = @_;
    die "Not enough arguments passed to constructor" if @args < 2;
    # ...
}

또한보십시오 프로토 타입에 대한이 초기 질문 그리고 왜 그들은 일반적으로 그렇게 좋은 생각이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top