Perl:如何模拟Ruby';s";包括/扩展“;机制?
如何在Perl代码中模拟Ruby的“include”/“extend”机制 让我们以Ruby中的以下代码为例:Perl:如何模拟Ruby';s";包括/扩展“;机制?,ruby,perl,include,extend,emulation,Ruby,Perl,Include,Extend,Emulation,如何在Perl代码中模拟Ruby的“include”/“extend”机制 让我们以Ruby中的以下代码为例: module ActiveRecord class Base class << self #... end #... end Base.class_eval do include ActiveRecord::Persistence extend ActiveModel::Naming extend
module ActiveRecord
class Base
class << self
#...
end
#...
end
Base.class_eval do
include ActiveRecord::Persistence
extend ActiveModel::Naming
extend QueryCache::ClassMethods
extend ActiveSupport::Benchmarkable
extend ActiveSupport::DescendantsTracker
include ActiveModel::Conversion
include Validations
extend CounterCache
include Locking::Optimistic, Locking::Pessimistic
include AttributeMethods
...
end
end
模块活动记录
阶级基础
类,看起来像traits/mixins与继承,两者都是在运行时完成的
特性/混合子部分包含在一个称为角色的Perl6概念中
如何在Perl5中实现?不要看得太远(另请参见)
我相信它是作为面向对象/元语言支持特性的试验场开始的,这些特性以Perl6为代表,但以Perl5为代表。现在它有了自己的生命,许多CPAN包都依赖于Moose
Moose实现了多种面向对象的语言构造(来自一些不同的OO范例),并且具有很强的可扩展性
有关Moose中的概念以及它们如何映射到其他语言中的结构的解释,请参见
此外,CPAN上的Moose
和MooseX
名称空间塞满了免费(或实验性)软件包,以增加对更多OO构造的支持。以下是一个小示例:
#!/usr/bin/env perl
use 5.014;
package My::Quoted {
use Role::Tiny;
sub quoted_name {
my $self = shift;
return sprintf q{"%s"}, $self->name;
}
}
package My::One {
use Moo;
has name => (is => 'ro');
sub greet {
my $self = shift;
return sprintf 'Hello %s', $self->name;
}
}
package My::Two {
use Moo;
extends 'My::One';
with 'My::Quoted';
sub greet {
my $self = shift;
return sprintf 'Merhaba %s', $self->quoted_name;
}
}
package main {
run('Perl');
sub run {
my $name = shift;
my $x = My::Two->new({name => $name});
my $y = My::One->new({name => $name});
say $_->greet for $x, $y;
}
}
输出:
Merhaba "Perl"
Hello Perl
Merhaba“Perl”
Hello Perl将此代码直译为Perl/Moose(有点)如下:
package ActiveRecord::Base;
use Moose;
use namespace::autoclean;
with qw(
ActiveRecord::Persistence
ActiveModel::Naming
QueryCache::ClassMethods
ActiveSupport::Benchmarkable
ActiveSupport::DescendantsTracker
ActiveModel::Conversion
Validations
CounterCache
Locking::Optimistic
Locking::Pessimistic
AttributeMethods
);
__PACKAGE__->meta->make_immutable;
1;
上述用途相当于Ruby的mixin
在Ruby中,include
用于实例方法中的混合,而extend用于类混合。在Perl中,所有方法都可以通过类或实例调用,因此可以使用和
添加角色