Perl:如何模拟Ruby';s";包括/扩展“;机制?

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

如何在Perl代码中模拟Ruby的“include”/“extend”机制

让我们以Ruby中的以下代码为例:

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中,所有方法都可以通过类或实例调用,因此可以使用
添加角色