나는 몇 시간 동안 펄을 사용하고 있습니다 만, 오늘은이 코드를 건너 온 : 펄이 무슨 뜻 무엇
sub function1($$)
{
//snip
}
?
나는 몇 시간 동안 펄을 사용하고 있습니다 만, 오늘은이 코드를 건너 온 : 펄이 무슨 뜻 무엇
sub function1($$)
{
//snip
}
?
두 개의 스칼라 인수를 취하는 prototype이있는 함수입니다.
아래 주석에 언급 된대로 실제로 Perl 프로토 타입을 실제로 사용하지 않는 것에 대한 강력한 주장이 있습니다. 가장 강력한 인수는 아마도 :
는 2008 년에 StackOverflow에 대한 논의있다 :
이MooseX::Method::Signatures 모듈의 교환 가능이있다.
다른 대답에 언급 된대로 $$
은 프로토 타입을 선언합니다. 다른 대답은 프로토 타입이 무엇인지 말하지 않습니다. 그들은 입력 검증을위한 것이 아니라 파서에 대한 힌트입니다. 이 같은 모호한 무언가를 쓸 때 이제
sub foo($) { ... }
sub bar($$) { ... }
:
이 두 기능은 같은 선언 한 상상
foo bar 1, 2
괄호를 넣어 곳 펄 알고; bar는 두 개의 arg를 취하므로 가장 가까운 두 개의 arg를 소비합니다. 푸 하나 ARG 소요되므로 바의 결과 두 인수 취
가foo(bar(1,2))
다른 예 :
bar foo 2, 3
동일한 적용하는 단계; 는 2 줄이 두 개의 인수를 취 얻을 수 있도록 foo는이 하나 개의 인수를 취 그래서 foo(2)
3 얻는다 : "사용하지 않습니다"라고 그래서 기각,
bar(foo(2),3)
이 펄의 매우 중요한 부분은 당신을하고있다 해로운 일. 거의 모든 내부 함수는 프로토 타입을 사용하므로, 자신의 코드에서 어떻게 작동하는지 이해함으로써 내장 함수가 어떻게 사용되는지 더 잘 이해할 수 있습니다. 그런 다음 불필요한 괄호를 피할 수 있습니다. 그러면 더 깔끔한 코드가됩니다. 나는에 대해 경고합니다 마지막으로
, 하나의 안티 - 패턴 :package Class;
sub new ($$) { bless $_[1] }
sub method ($) { $_[0]->{whatever} }
당신이 방법 (Class->method
또는 $instance->method
)와 같은 코드를 호출, 프로토 타입 검사는 완전히 의미가 없습니다. 코드를 메서드로만 호출 할 수있는 경우 프로토 타입을 추가하는 것은 잘못되었습니다. 이 작업을 수행하는 인기있는 모듈 (hello, XML::Compile
)을 보았지만 잘못되었습니다. 그러지 마세요.
sub foo {
my ($self, $a, $b) = @_; # $a and $b are the bars to fooify
....
또는 foo($$)
달리
use MooseX::Method::Signatures;
method foo(Bar $a, Bar $b) { # fooify the bars
....
은, 이러한 의미 있고 읽을 수 있습니다 : 당신에 대해 어떻게 전달하는 방법을 많은 인수 문서화하십시오.
감사합니다. 나는 거의 그것을 알아 냈다. 왜 그것이 필요합니다, 일종의 종류 및 매개 변수에 번호 확인, 그것은 무엇입니까? – sud03r
Perl에는 프로토 타입이 필요하지 않습니다. 그들은 전적으로 선택 사항입니다. 그러나 C 코드에서와 마찬가지로 프로토 타입을 제공하면 오류가 발생하지 않고 감지 할 수 있습니다. 부분적으로 Perl 코더는 프로토 타입없이 Perl 잠수함의 유연성을 (전체적으로 좋게) 활용하고 부분적으로는 Perl 코더가 프로토 타입없이 Perl 잠수함의 유연성을 이용하기 때문에 부분적으로는 내 경험에 비추어 볼 때 자주 사용되지 않습니다. 왜냐하면 사람들은 자동으로 오류를 피하기를 좋아하지 않기 때문에 (그들은 어려운 길을 찾는 것을 선호하는 것 같습니다). –
프로토 타입은 현대 Perl에서 사용되지 않기 때문에 깨졌습니다. 어떻게 깨졌습니까? 다음은 수많은 문제 중 하나를 보여주는 최근의 질문입니다. http://stackoverflow.com/questions/2485106/why-do-printf-and-sprintf-behave-differently 프로토 타입은 유형 확인에 사용되지 않으며, 힌트입니다. 컴파일러 및 Perl은 프로토 타입에 맞도록 호출자의 주장을 억압합니다 *. – rjh