Perl 5의 함수 타입이 나쁜 이유는 무엇입니까?
또 다른 스택 오버플로 질문에서 Leon Timmermans는 다음과 같이 주장했습니다.
타입을 사용하지 말라고 조언합니다. 그들에게 발송되는 경우에 사용합니다.
왜 사실일까요? 필자는 항상 Perl 함수에 대해 거의 항상 제공하며 다른 사람들이 사용하는 것에 대해 나쁜 말을 한 적이 없습니다.
언어 사용하기 전에 준비하세요. 어려움은 Perl의 준비 방식이 사람들이 기대하는 방식으로 작동하지 않습니다. 다른 프로그래밍 언어의 배경 지식을 가진 사람들이있는 타입이 함수 호출이 올바른지, 즉 올바른 수와 유형의 인수를 가지고 있는지 확인하기 위해 제공 할 것이 기대합니다. Perl의 장비 타입은이 작업에 적합하지 않습니다. 그것은 오용 나쁜. Perl의 기본 유형은 단일하고 매우 다른 목적을 가지고 있습니다.
타입 타입을 사용하면 내장 함수처럼 동작하는 함수를 정의 할 수 있습니다.
- 괄호는 선택 사항입니다.
- 논쟁에 대한 맥락이 제시된다.
예를 들어 다음과 같은 함수를 정의 할 수 있습니다.
sub mypush(\@@) { ... }
그리고 그것을
mypush @array, 1, 2, 3;
를 쓸 필요없이 \
배열에 대한 참조를 가져옵니다.
간단히 말해 한정을 사용하면 고유 한 구문 설탕을 만들 수 있습니다. 예를 들어 Moose 프레임 워크는이를 사용하여 일반적인 OO 구문을 에뮬레이션합니다.
이것은 매우 유용하지만 준비는 매우 제한적입니다.
- 타임에 볼 수 있어야합니다.
- 우회 될 수 있습니다.
- 설치를 인수로 임명하면 무시할 수 있습니다.
- 엄격하게 규정 된 형식 이외의 것을 사용하여 함수를 호출하는 것을 어렵게 만들 수 있습니다.
모든 세부 사항은 perlsub의 준비 유형 을 참조 하십시오.
문제는 Perl의 함수 타입이 사람들이 생각하는 것을 않습니다. 결혼식 목적은 Perl의 내장 함수처럼 구문 분석이 될 함수를 발견하는 것입니다.
우선, 메소드 호출은 완전히 복제됩니다. OO 프로그래밍을 수행하는 경우 메소드에 어떤 유형이 있는지 중요하지 않습니다. 따라서 타입이 없어야합니다.
둘째, 엄격하게 엄격하게 적용됩니다. 로 서브 루틴을 호출 &function(...)
하면 처음부터 시작됩니다. 실제로 어떤 유형의 안전도 제공하지 않습니다.
셋째, 그들은 거리에서 짜증나는 행동입니다. (수신 $
되는 변수가 기본 목록 대신에 사용됩니다.)
특히, 배열에서 매개 변수를 전달하기 어렵습니다. 예를 들면 다음과 같습니다.
my @array = qw(a b c);
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
sub foo ($;$$) { print "@_\n" }
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
인쇄물 :
a b c
a b
a b c
3
b
a b c
main::foo() called too early to check prototype
(경고가 활성화 된 경우) 에 대한 3 가지 경고와 함께 . 문제는 스칼라 배열에서 평가 된 배열 (또는 배열)이 배열의 길이를 반환하는 것입니다.
내장 기능을 사용할 함수를 작성해야합니다. 제품 타입을 사용하지 않습니다.
참고 : Perl 6은 완전히 개선되고 매우 유용한 것이 있습니다. 이 답변은 Perl 5에만 적용됩니다.
위의 두 포스터에 동의합니다. 일반적으로 사용 $
을 피해야합니다. 블록 인수 (사용시 원형에만 유용하다 &
)와 globs와 ( *
) 또는 기준 프로토 타입 ( \@
, \$
, \%
, \*
)
Perl 서브 루틴 타입을보고있는 일부 사람들은 그것이 아닌 것을 의미합니다.
sub some_sub ($$) { ... }
펄에게 이것이 파서가 두 가지 주장을 기대한다는 것을 의미한다. 내장 코드처럼 동작하는 서브 루틴을 만들 수있게하는 Perl의 방법입니다. perlsub 에서 종류에 대해 준비 할 수 있습니다.
문서를 읽지 않고 사람들은 프로토 타입이 런타임 인수 검사 또는 다른 언어에서 본 것과 유사한 것을 참조한다고 추측합니다. 사람들이 Perl에 대해 추측하는 대부분의 것과 마찬가지로, 그들은 잘못된 것으로 판명되었습니다.
그러나 Perl v5.20부터 Perl에는 사용자가 기대하는 것과 유사한 것을 제공하는 실험적인 기능이 있습니다. Perl의 서브 루틴 서명 은 런타임 인수 계수, 변수 할당 및 기본 설정을 수행합니다.
use v5.20;
use feature qw(signatures);
no warnings qw(experimental::signatures);
animals( 'Buster', 'Nikki', 'Godzilla' );
sub animals ($cat, $dog, $lizard = 'Default reptile') {
say "The cat is $cat";
say "The dog is $dog";
say "The lizard is $lizard";
}
이것은 프로토 타입을 고려하고 있다면 아마도 원하는 기능입니다.
참고 URL : https://stackoverflow.com/questions/297034/why-are-perl-5s-function-prototypes-bad
'IT' 카테고리의 다른 글
현재 글자가 메인 보드인지 확인 (0) | 2020.07.20 |
---|---|
왜 우리는 Loggers를 static final로 선언합니까? (0) | 2020.07.20 |
SQL에서 뷰에 서열 변수를 있습니까? (0) | 2020.07.20 |
무시 된 파일을 마이너스 상태에서 유지 (0) | 2020.07.20 |
이해력은 이해 범위 이후에도 이름을 리 바인드합니다. (0) | 2020.07.20 |