美文网首页码神之路:Perl篇
Mojo::Base (不仅仅是对文档的翻译)

Mojo::Base (不仅仅是对文档的翻译)

作者: JSON_NULL | 来源:发表于2016-09-30 01:23 被阅读68次

    Mojo::Base - Minimal base class for Mojo projects
    <b> status: Completed </b>

    有关Perl的学习、交流与分享,请关注专题:码神之路:Perl篇

    简介

    Mojo::BaseMojo 项目的一个最小基类
    为 Mojo 项目提供了一个简单易用的接口,并且自动引用了 strict, warnings, utf8 和 5.10 特性。

    有关 Mojo,Mojolicious 的介绍后续会慢慢整理并陆续更新,到时会在“这里”放上快速转向的链接。

    ## Automatically enables "strict", "warnings", "utf8" and Perl 5.10 features  
    ## 以下是三种 Mojo::Base 模块的使用方式
    use Mojo::Base -strict;  
    use Mojo::Base -base;  
    use Mojo::Base 'SomeBaseClass';
    

    Mojo::Base 有三种使用方式,都可以节省很多代码输入

    use Mojo::Base -strict

    ## use Mojo::Base -strict;   相当于以下代码
    use strict;  
    use warnings;   
    use utf8;   
    use feature ':5.10'; 
    use IO::Handle ();
    

    use Mojo::Base -base

    ## use Mojo::Base -base;  相当于以下代码
    use strict;  
    use warnings;  
    use utf8;   
    use feature ':5.10'; 
    use IO::Handle (); 
    use Mojo::Base;  
    push @ISA, 'Mojo::Base';  
    sub has { Mojo::Base::attr(__PACKAGE__, @_) }      
    

    use Mojo::Base 'SomeBaseClass'

     ## use Mojo::Base 'SomeBaseClass';   相当于以下代码
    use strict;   
    use warnings; 
    use utf8; 
    use feature ':5.10';  
    use IO::Handle (); 
    require SomeBaseClass;  
    push @ISA, 'SomeBaseClass';  
    use Mojo::Base;  
    sub has { Mojo::Base::attr(__PACKAGE__, @_) }      
    

    函数

    Mojo::Base 实现了以下函数,并且它们可以通过 -base 标记或设置 基类 的方式导出。
    也就是说 通过以下两种方式的代码 可以把 Mojo::Base 中的函数导入到目标模块中。

     use Mojo::Base -base;  
     use Mojo::Base 'SomeBaseClass';    
    

    has 函数

    has 函数 就像 attr 方法一样,为基于 HASH 结构的对象创建一个属性访问器。

    ## has 函数 的使用方式有如下几种
    
    has 'name'; 
    has ['name1', 'name2', 'name3']; 
    has name => 'foo';
    has name => sub {...};
    has ['name1', 'name2', 'name3'] => 'foo';
    has ['name1', 'name2', 'name3'] => sub {...};
    

    方法

    Mojo::Base 有以下方法

    attr 方法

    为基于 HASH 结构的对象创建属性访问器。把一个数组的引用作为属性参数可以一次创建多个属性访问器。第二个参数是可选的,用来给属性设置默认值,通常情况下它应该是一个常量或是一个回调(sub)。在没有给属性设置值的情况下读取属性的值时这个回调将会被执行。属性访问器是可以链式使用的,也就是说如果给属性访问器传数的话,它将返回调用它的对象。

    ## attr 方法的使用方式如下:
    
    $object->attr('name');
    SubClass->attr('name');
    SubClass->attr(['name1', 'name2', 'name3']);
    SubClass->attr(name => 'foo');
    SubClass->attr(name => sub {...});
    SubClass->attr(['name1', 'name2', 'name3'] => 'foo');
    SubClass->attr(['name1', 'name2', 'name3'] => sub {...});
    

    new 方法

    这个基类提供了一个基本的基于 HASH 结构对象的构造方法。你可以使用 HASH 结构或 refhash 作为属性来创建一个对象。

    my $object = SubClass->new;
    my $object = SubClass->new(name => 'value');
    my $object = SubClass->new({name => 'value'});
    

    tap 方法

    利用方法可链式操作的特性在对象的方法链上执行操作。目标对象将作为第一个参数传递给回调,并且同时会赋值给 $_。回调的返回值将会被忽略,取而代之的是返回目标对象本身。用这种方式,任何代码都可以作为对象的方法在方法链中执行。

    # Longer version 
    $object = $object->tap(sub { $_->some_method(@args) });
    
    # Inject side effects into a method chain
    $object->foo('A')->tap(sub { say $_->foo })->foo('B');
    

    with_roles

    my $new_class = SubClass->with_roles('SubClass::Role::One');
    my $new_class = SubClass->with_roles('+One', '+Two');
    $object       = $object->with_roles('+One', '+Two');
    

    创建一个具有一个或多个Role::Tiny角色的新类。如果在类上调用则返回一个新类,如果在对象上调用,则将对象重新赋予新类的特性。对于在当前类名句空间后的角色(MyClass::Role::RoleName)可以使用简写的+RoleName表示角色的全称。需要注意的是,支持此功能需要安装Role::Tiny (2.000001+)。

    with_role的实现如下:

    sub with_roles {
      Carp::croak 'Role::Tiny 2.000001+ is required for roles' unless ROLES;
      my ($self, @roles) = @_;
    
      return Role::Tiny->create_class_with_roles($self,
        map { /^\+(.+)$/ ? "${self}::Role::$1" : $_ } @roles)
        unless my $class = Scalar::Util::blessed $self;
    
      return Role::Tiny->apply_roles_to_object($self,
        map { /^\+(.+)$/ ? "${class}::Role::$1" : $_ } @roles);
    }
    

    相关推荐

    有关Perl的学习、交流与分享,请关注专题:码神之路:Perl篇

    相关文章

      网友评论

        本文标题:Mojo::Base (不仅仅是对文档的翻译)

        本文链接:https://www.haomeiwen.com/subject/etylyttx.html