Mojo::Collection

简介

Mojo::Collection是基于数据的容器集。

use Mojo::Collection;
# Manipulate collection
my $collection = Mojo::Collection->new(qw(just works));
unshift @$collection, 'it';
say $collection->join("\n");

# Chain methods
$collection->map(sub { ucfirst })->shuffle->each(sub {
  my ($word, $num) = @_;
  say "$num: $word";
});

# Use the alternative constructor
use Mojo::Collection 'c';
c(qw(a b c))->join('/')->url_escape->say;

函数

Mojo::Collection 中仅实现了以一个方法c可以单独导入。

my $collection = c(1, 2, 3);

方法c可以构造一个新的基于数组的Mojo::Collection对象。

方法

Mojo::Collection 实现了如下方法。

TO_JSON

my $array = $collection->TO_JSON;

功能与 to_array 方法相同,是 to_array 方法的别名。

compact

my $new = $collection->compact;

使用$collection对象中的所有已经定义过且不是空字符串的元素创建一个新的Mojo::Collection对象。

# "0, 1, 2, 3"
c(0, 1, undef, 2, '', 3)->compact->join(', ');

each

my @elements = $collection->each;
$collection  = $collection->each(sub {...});

这个函数有两种调用方式:
一、在不传任何参数时,返回集合中所有元素的列表。
二、传一个函数指针作为参数时,会遍历集合中的每个元素,并把当前元素会做为回调函数的第一个参数传递, 也可为 $_ 取得。返回$collection自身。

# Make a numbered list
$collection->each(sub {
  my ($e, $num) = @_;
  say "$num: $e";
});

each方法的实现代码如下:

sub each {
  my ($self, $cb) = @_;
  return @$self unless $cb;
  my $i = 1;
  $_->$cb($i++) for @$self;
  return $self;
}

first

my $first = $collection->first;
my $first = $collection->first(qr/foo/);
my $first = $collection->first(sub {...});
my $first = $collection->first('some_method');
my $first = $collection->first('some_method', @args);

该方法有四种调用方式:
一、没有任何参数,返回集合中的第一个元素。
二、以一个正则表达式为参数,返回第一个与正则表达匹配的元素。
三、以一个回调函数(函数针或函数名)为参数,遍历集合,并且以当前元素为第一个参数调用回调函数,返回第一个使回调函数返回true的元素。
四、传多个参数,且第一个参数是回调函数(函数针或函数名);遍历集合,并且以当前元素为第一个参数,后面跟调用此方法时除回调函数外的其他参数,调用回调函数,返回第一个使回调函数返回true的元素。

注:在回调函数中可以使用$_作为其接收的第一个参数使用。

# Longer version
my $first = $collection->first(sub { $_->some_method(@args) });

# Find first value that contains the word "mojo"
my $interesting = $collection->first(qr/mojo/i);

# Find first value that is greater than 5
my $greater = $collection->first(sub { $_ > 5 });

flatten

my $new = $collection->flatten;

如果$colection是一个多维的数组,调用此方法后会得到一个包含所有元素的一维数组。这个方法会递归地处理$colection,无论多维数组的层级有多深,最终都可以得到一个包含所有元素一维数组。

# "1, 2, 3, 4, 5, 6, 7"
c(1, [2, [3, 4], 5, [6]], 7)->flatten->join(', ');

grep

my $new = $collection->grep(qr/foo/);
my $new = $collection->grep(sub {...});
my $new = $collection->grep('some_method');
my $new = $collection->grep('some_method', @args);

该方法有三种调用方式:
一、以一个正则表达式为参数,遍历集合用所有与正则表达式匹配的元素构建一个新的集合并返回。
二、以一个回调函数(函数针或函数名)为参数,遍历集合,并且以当前元素为第一个参数调用回调函数,用所有使回调函数返回true的元素构建一个新的集合并返回。
三、传多个参数,且第一个参数是回调函数(函数针或函数名);遍历集合,并且以当前元素为第一个参数,后面跟调用此方法时除回调函数外的其他参数,调用回调函数,用所有使回调函数返回true的元素构建一个新的集合并返回。

注:在回调函数中可以使用$_作为其接收的第一个参数使用。

# Longer version
my $new = $collection->grep(sub { $_->some_method(@args) });

# Find all values that contain the word "mojo"
my $interesting = $collection->grep(qr/mojo/i);

# Find all values that are greater than 5
my $greater = $collection->grep(sub { $_ > 5 });

join

my $stream = $collection->join;
my $stream = $collection->join("\n");

将集合转换为Mojo::ByteStream对象。

# Join all values with commas
$collection->join(', ')->say;

last

my $last = $collection->last;

返回集合中的最后来个元素。

map

my $new = $collection->map(sub {...});
my $new = $collection->map('some_method');
my $new = $collection->map('some_method', @args);

该方法有两种调用方式:
一、以一个回调函数(函数针或函数名)为参数,遍历集合,并且以当前元素为第一个参数调用回调函数,用每次调用回调函数的返回值为元素构建一个新的集合并返回。
二、传多个参数,且第一个参数是回调函数(函数针或函数名);遍历集合,并且以当前元素为第一个参数,后面跟调用此方法时除回调函数外的其他参数,调用回调函数,用每次调用回调函数的返回值为元素构建一个新的集合并返回。

注:在回调函数中可以使用$_作为其接收的第一个参数使用。

# Longer version
my $new = $collection->map(sub { $_->some_method(@args) });

# Append the word "mojo" to all values
my $mojoified = $collection->map(sub { $_ . 'mojo' });

new

my $collection = Mojo::Collection->new(1, 2, 3);

构造一个基于数组的Mojo::Collection对象。

reduce

my $result = $collection->reduce(sub {...});
my $result = $collection->reduce(sub {...}, $initial);

该方法有两种调用方式:
一、以一个回调函数(函数针)为参数;遍历集合,第一次以集合中的第一个元素为$a,第二个元素为$b调用回调函数,然后以上一次调用回调函数的返回值为$a,以集合中的下一个元素为$b调用回调函数;直到所有函数都处理完后把回调函数的返回调返回。
二、传两个参数,第一个参数是回调函数(函数针),第二个参数是一个“起始值$initial”;遍历集合,第一次以“起始值$initial”为$a,以集合中的第一个元素为$b调用回调函数,然后以上一次调用回调函数的返回值为$a,以集合中的下一个元素为$b调用回调函数;直到所有函数都处理完后把回调函数的返回调返回。

# Calculate the sum of all values
my $sum = $collection->reduce(sub { $a + $b });

# Count how often each value occurs in collection
my $hash = $collection->reduce(sub { $a->{$b}++; $a }, {});

reverse

my $new = $collection->reverse;

创建一个新的Mojo::Collection对象,其中的元素是原集合中元素的倒序。

slice

my $new = $collection->slice(4 .. 7);

此方法中的参数为元素在集合中的下标。调用完成后会按参数中指定的顺序创建一个包含所有选定元素的集合。

# "B C E"
c('A', 'B', 'C', 'D', 'E')->slice(1, 2, 4)->join(' ');

shuffle

my $new = $collection->shuffle;

以随机顺序创建一个包含所有元素的新集合。

size

my $size = $collection->size;

返回集合中元素的数量。

sort

my $new = $collection->sort;
my $new = $collection->sort(sub {...});

根据回调函数的返回值返回一个新的排序了的集合。如果不传参数,默认为降序。

# Sort values case insensitive
my $insensitive = $collection->sort(sub { uc($a) cmp uc($b) });

tap

$collection = $collection->tap(sub {...});

Mojo::Base 中 tap 的别名。

to_array

my $array = $collection->to_array;

将集合转化为数组引用。

uniq

my $new = $collection->uniq;
my $new = $collection->uniq(sub {...});
my $new = $collection->uniq('some_method');
my $new = $collection->uniq('some_method', @args);

该方法有四种调用方式:
一、没有任何参数,根据原集合中的元素创建一个没有重复元素的集合。
二、以一个回调函数(函数针或函数名)为参数,遍历集合,并且以当前元素为第一个参数调用回调函数,使用返回值不重复的元素创建一个新的集合。
三、传多个参数,且第一个参数是回调函数(函数针或函数名);遍历集合,并且以当前元素为第一个参数,后面跟调用此方法时除回调函数外的其他参数,调用回调函数,使用返回值不重复的元素创建一个新的集合。

# Longer version
my $new = $collection->uniq(sub { $_->some_method(@args) });

# "foo bar baz"
c('foo', 'bar', 'bar', 'baz')->uniq->join(' ');

# "[[1, 2], [2, 1]]"
c([1, 2], [2, 1], [3, 2])->uniq(sub{ $_->[1] })->to_array;

with_roles

my $new_class = Mojo::Collection->with_roles('Mojo::Collection::Role::One');
my $new_class = Mojo::Collection->with_roles('+One', '+Two');
$collection   = $collection->with_roles('+One', '+Two');

Mojo::Base 中 with_roles 的别名。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容