Perl은 약간의 도움이 필요합니다. 해시에 저장된 코드 참조를 "메소드"로 간주하지 않기 때문입니다. 메소드는 패키지 기호 테이블에 항목으로 구현됩니다.Perl은 클래스 지향보다 자랑스럽게 더 객체 지향 (on 개별 개체)입니다.
이 기능을 수행하려면이 방법으로 참조를 매핑 한 클래스를 만들어야합니다. 기호 테이블의 메서드를 가져 오는 방법은 AUTOLOAD
메서드입니다. 패키지에 AUTOLOAD
서브 루틴이 포함되어있는 경우, 상속 체인에서 Perl이 찾을 수없는 축복 된 객체를 호출하면 AUTOLOAD
을 호출하고 패키지 범위 (our
) 변수 $AUTOLOAD
에 의 전체 이름을 포함하게됩니다. 기능.
정규화 된 하위 이름의 마지막 노드 (마지막 '::'다음)를 가져 와서 호출되는 메소드의 이름을 가져옵니다. 해당 위치에 코드 참조자가 있는지 살펴보고, 코드 판독기가있는 경우 반환 할 수 있습니다.
package AutoObject;
use strict;
use warnings;
use Carp;
use Params::Util qw<_CODE>;
our $AUTOLOAD;
sub AUTOLOAD {
my $method_name = substr($AUTOLOAD, index($AUTOLOAD, '::') + 2);
my ($self) = @_;
my $meth = _CODE($self->{$method_name});
unless ($meth) {
Carp::croak("object does not support method='$method_name'!");
}
goto &$meth;
}
1;
그런 다음 해당 클래스로 객체를 축복합니다 :
package main;
my $obj
= bless { foo => 1
, hello => sub { return 'world' }
}, 'AutoObject';
print $obj->hello();
일반적으로, AUTOLOAD
하위에있는 I "시멘트"동작을. 즉, 다음에 AUTOLOAD
을 피하기 위해 패키지 기호 테이블에 항목을 만듭니다. 그러나 이것은 보통 합리적으로 정의 된 클래스 동작을위한 것입니다.
또한 선언 된 각 객체에 대해 패키지를 만드는 QuickClass
을 디자인했으나 Class::MOP
으로 더 잘 수행 될 수있는 많은 논쟁 테이블을 포함합니다.
에릭 스트롬의 제안에 따라 다음 코드를 AutoObject 패키지에 추가 할 수 있습니다. import
sub는 누군가 use
-d AutoObject
(매개 변수 'object'
)으로 언제든지 호출됩니다.
use AutoObject qw<object>;
그리고 표현은 다음과 같습니다 : 당신은이 "개체 리터럴"만들고 싶었 때
# Definition:
sub object ($) { return bless $_[0], __PACKAGE__; };
sub import { # gets called when Perl reads 'use AutoObject;'
shift; # my name
return unless $_[0] eq 'object'; # object is it's only export
use Symbol;
*{ Symbol::qualify_to_reference('object', scalar caller()) }
= \&object
;
}
그리고, 당신은 할 수
object { foo => 1, hello => sub { return 'world' } };
당신도 할 수 :
object { name => 'World'
, hello => sub { return "Hello, $_[0]->{name}"; }
}->hello()
;
그리고 "개체 리터럴 "표현. 아마 모듈은 Object::Literal
이라고 더 좋을 것입니다.
펄 방법은 해시 필드 아니다 - 이것은 자바되지 않습니다. – Ether
자바 스크립트가 자바가 아닙니다. – cjm