简介
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 的别名。