2012-12-05 8 views
1

호출자가 값을 무시하거나 인스턴스 변수를 기본값으로 사용할 수있는 메서드 집합이 있습니다. 나는이 모든 곳에서MooseX :: Method :: Signatures를 인스턴스 변수 기본값으로 설정합니다.

method foo(Str :$blah?) { 
    $blah = $self->blah unless defined $blah; 
    #doStuff 
} 

끔찍한하지 않음 일을 끝낼 수 있도록 구문 분석 오류가 발생

method foo(Str :$blah = $self->blah) { 
    #doStuff 
} 

,하지만 바보 같다 때 MooseX :: 방법 :

그래서 내가 뭘하려고 계속 것은 :: Signatures는 기본 개념을 지원하고 다른 모든 표준 'method of start'행을 고정했습니다.

언제나 이와 같은 일을하려고 할 때 웹에서 다른 사람을 찾을 수 없으며 동일한 문제가 발생하면 문제를 잘못된 방식으로 접근하고 있습니다. 메소드가 객체에서 작동하는 메소드가 아니라 외부를 호출하는 헬퍼 함수이기 때문에 실제 프로그램보다 오히려 기능적 프로그램을 잼 (jam)하려고 시도하는 것처럼 보입니다. 그래서 그냥 잘못 정의하고 있는지 또는 내가하고있는 일이 "벙어리"인지 아니면 Parse :: Method :: Signatures에 의해 지원되지 않는지를 확인하면됩니다.

답변

1

AFAIK 서명 모듈은 자체를 Perl 구문 분석기에 연결하고 프로토 타입을 처리 할 수있는 코드를 삽입합니다. 이것이 효과가 있다는 것은 놀랍습니다.

즉, 기본값으로 비정규 값을 사용하면 문제가 발생할 수 있습니다. 그리고 값을 미리 채우기 위해 일부 코드를 호출하면 혼란을 야기 할 수있는 시나리오가있을 수 있습니다. 특히, 값을 미리 채우는 코드는 인수 값이 주어지지 않거나 항상 호출되어야하는 경우에만 호출해야합니까? 부작용은 어떻게해야합니까? caller은 무엇이되어야합니까? 전역 $self 개체가있는 경우 범위 지정 규칙에서 명확하게 지시하므로 메서드 호출을 수신해서는 안됩니까? (our $x=5; my $x=$x;이 유효하지만, 바로 my $x=$x이 아닙니다. 더 좋게는, 디폴트 값 population 메소드 호출이 동일한 메소드를 호출하지만, 선택적 매개 변수에 대한 값이없는 경우에는 어떻게됩니까?

당신은 항상 구식 선택적 매개 변수로 다시 떨어질 수 :이 경우

sub foo { 
    my ($self, $blah) = @_; 
    # something like my ($self, $blah) = (@_, $self->blah); wouldn't work, of course. 
    $blah //= $self->blah; # nicer than old `unless defined` 
    ...; 
} 

또는 :

method foo (:$blah?) { 
    $blah //= $self->blah 
} 

꽤 즐거운 정의 또는 연산자의 사용을 찾을 수 있습니다.

+0

나는 상수 값이 아닌 것들에 대해 알아 보겠습니다. 필자는 내 머리 속에''정의되지 않은''또는'// ='코드처럼 작동하도록 호출을 기대했다. 이것은 전적으로 근거가없는 가정에 기반을 둡니다. 메소드 서명은 표현하고 삽입 한 하위로 파싱되며 실제 메소드 호출을 위해 $ self를 남겨 둡니다. 소스를 둘러보고 실제로 무엇을하는지 볼 시간입니다. 정의 또는 팁을 주셔서 감사합니다, 그 전에 본 적이 없었어요. – Matt

관련 문제