问题是你的结束条件
*.day-of-week==5 && *.week[1]+1==Date.today.week[1]
这是两个WhateverCode lambda,每个都有 1 个参数。
*.day-of-week==5
*.week[1]+1==Date.today.week[1]
由于代码对象是真值,因此&&
运算符移至第二个。因此,当到达前一周的星期日时,序列就会停止。
即使代码是单个 lambda,它也不会像您期望的那样工作,因为它将是一个带有两个参数的 lambda。
进行此检查的正确方法是使用某种块。
{.day-of-week==5 && .week-number+1 == Date.today.week-number}
将其包装在子例程中可能是一个好主意,以便您可以测试它。
sub last-friday ( Date:D $date ) {
# cache it so that it doesn't have to be looked up on each iteration
my $week-number = $date.week-number - 1;
(
$date,
*.earlier( :1day )
...
{
.day-of-week == 5
&&
.week-number == $week-number
}
).tail
}
say last-friday Date.new: :year(2018), :month( 5), :day( 9); # 2018-05-04
say last-friday Date.new: :year(2018), :month( 5), :day(12); # 2018-05-04
say Date.today.&last-friday; # 2018-05-04
您也可以计算正确的日期。
sub last-friday ( Date:D $date ) {
$date.earlier:
days => (
$date.day-of-week # reset to previous sunday
+ 2 # go two days earlier to get friday
)
}
say last-friday Date.new: :year(2018), :month( 5), :day( 9); # 2018-05-04
say last-friday Date.new: :year(2018), :month( 5), :day(12); # 2018-05-04
say Date.today.&last-friday; # 2018-05-04