문제

Perl에는 OOP 기능이 있지만 거의 사용되지 않습니다.메소드와 속성을 사용하여 Perl 객체를 어떻게 만들고 사용합니까?

도움이 되었습니까?

해결책

꼭 살펴보셔야 할 것 Moose.

package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

Moose는 무엇보다도 생성자, 접근자 메서드 및 유형 검사를 무료로 제공합니다!

따라서 코드에서 다음을 수행할 수 있습니다.

my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15);     # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5);   # FAILS! Free type check.

좋은 출발점은 Moose::Manual 그리고 Moose::Cookbook

기본적인 것만 필요한 경우에도 사용할 수 있습니다. Mouse 완전하지는 않지만 대부분의 컴파일 시간 패널티가 없습니다.

다른 팁

엘크, 분명히.

package Person;
use Moose;
has age => ( isa => Int, is => 'rw'); 
has name => ( isa => Str, is => 'rw'); 
1;

즉시, new() 메소드와 방금 'has'로 정의한 속성에 대한 접근자 메소드를 무료로 갖게 됩니다.따라서 다음과 같이 말할 수 있습니다.

my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";

등등.그뿐만 아니라, 접근자 메소드는 무료로 유형 검사를 제공합니다(그리고 표준 유형뿐만 아니라 자신만의 유형을 정의할 수도 있습니다).게다가 서브클래싱을 위한 '확장', 역할/특성을 위한 'with' 및 강력하고 유지 관리가 가능한 OO 코드를 작성하는 실제 작업을 수행할 수 있게 해주는 모든 종류의 훌륭한 기능을 얻을 수 있습니다.

TMTOWTDI이지만 이것은 작동합니다.

현재 내가 사용하는 개체::인사이드아웃 개체를 원할 때마다 매우 훌륭하고 표준 축복받은 해시 개체에 비해 많은 기능을 제공할 것입니다.그렇긴 하지만, 만약 제가 새로운 프로젝트를 시작한다면 저는 진지하게 Moose를 살펴볼 것입니다.

공식 PERL 문서를 읽는 것은 좋지만, 아니다 자신만의 객체 프레임워크 역할을 시도하거나 해시를 사용하여 객체를 구축하는 것이 좋습니다. 쉬운 길을 택하고 캡슐화를 완전히 깨는 객체 "개인" 변수에 직접 "피크"하려는 유혹은 없습니다. 원할 때 다시 물릴 것입니다. 객체를 리팩터링합니다.

Perl 객체는 단지 축복받은 해시가 아닙니다.그들은 축복받은 참고 자료입니다.이는 축복받은 해시 참조일 수 있으며(가장 자주 그렇습니다) 축복받은 스칼라 또는 배열 참조일 수도 있습니다.

공식 튜토리얼 CPAN 사이트 좋다.

이라는 좋은 글도 있어요 낙타똥 코드프로젝트에서

Perl에서 OO를 하고 싶다면 Moose를 살펴보는 것이 좋습니다.그러나 Perl에서 OO가 무엇을 의미하는지 이해하지 못한다면 별로 유용하지 않습니다.Perl OO가 내부적으로 어떻게 작동하는지 더 잘 이해하기 위해 나는 내 블로그에 개요를 썼습니다: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object- Oriented-perl/

데이터 구조의 관점에서 개체는 몇 가지 추가 기능이 있는 참조입니다.인터프리터는 이러한 특수 참조가 "bless"라는 키워드로 "축복"되었기 때문에 객체로 처리하는 방법을 알고 있습니다.축복받은 참조에는 개체임을 나타내는 플래그가 포함되어 있습니다.본질적으로 이는 해당 메소드에 대해 메소드를 정의하고 호출할 수 있음을 의미합니다.

예를 들어 기본 해시 참조를 만든 경우에는 작동하지 않습니다.$hashref->foo();

그러나 축복받은 해시 참조(객체라고도 함)를 생성하면 다음과 같이 작동합니다.$blessed_hashref->foo();

Moose는 시행 가능한 OO 레이어를 생성하고 접근자 메서드를 자동으로 처리하므로 여러 getter 및 setter를 정의할 필요가 없기 때문에 Perl의 OOP를 위한 탁월한 모듈입니다.Perl 인터프리터가 객체를 저장하는 방법을 보기 위해 Devel::Peak를 사용하는 데 관심이 있다면 위에 게시한 블로그 항목 링크를 따르세요.

한 발로 보면 각 클래스는 하나의 패키지입니다.패키지 변수를 설정하여 (원하는 경우 다중) 상속을 설정합니다. @ISA (바람직하게는 컴파일 타임에);다음을 사용하여 기존 데이터 조각(항상 그런 것은 아니지만 종종 인스턴스 변수를 저장하는 데 사용되는 익명 해시)에서 개체를 만듭니다. 신을 하다(참조 [, 클래스명]);$obj->methodname(@ARGS)과 같은 객체 메서드와 "CLASSNAME"->methodname(@ARGS)과 같은 클래스 메서드를 호출합니다.다중 상속 방법 해결 순서는 다음을 사용하여 변경할 수 있습니다. 미로.

이는 다소 단순하고 캡슐화를 강제하지 않기 때문에 더 많거나 다른 기능을 제공하는 다양한 모듈이 있습니다.

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