为什么“稍后”方法会导致“日期”范围内的无限范围?

我做了

在Julia中,您可以按月生成日期范围,如下所示:

julia> dr = Date(2014,1,29):Dates.Month(1):Date(2014,07,29)
Date("2014-01-29"):Month(1):Date("2014-07-29")

julia> collect(dr)
7-element Array{Date,1}:
 2014-01-29
 2014-02-28
 2014-03-29
 2014-04-29
 2014-05-29
 2014-06-29
 2014-07-29

Date(2014,1,29)是开始日期,Dates.Month(1)是步骤,Date(2014,07,29)是结束日期。

Raku稍后有一种方法,但是在自定义生成器中使用时,它会导致无限范围:

lazy my @dates = Date.new('2014-01-29'), Date.new('2014-02-28'), { $^a.later(:1month) } ... Date.new('2014-07-29')

如果我...运算符的右边* >= Date.new('2014-07-29')而不是使用它,那么它可以工作:Date.new('2014-07-29')

lazy my @a = Date.new('2014-01-29'), Date.new('2014-02-28'), { $^a.later(:1month) } ... * >= Date.new('2014-07-29')


2014-01-29
2014-02-28
2014-03-28
2014-04-28
2014-05-28
2014-06-28
2014-07-28
2014-08-28

为什么自定义生成器{ $^a.later(:1month) }{ $^a.later(:1month) } ... Date.new('2014-07-29')不停止2014-07-29,并导致无限的范围是多少?

用户0721090601

正如JJMerelo在评论中指出的那样,...操作员的工作方式是继续基于左手参数生成元素,直到(根据智能匹配)准确地达到了右手参数。

例如,如果我们制作了一个10的倍数的序列,

my @tens = 0, 10, 20 ... 95;
say @tens[10]; # 100
say @tens[11]; # 110

这是因为not of元素@tens实际上不会是95。要确定某个元素是否为最后一个元素,将使用smartmatch运算符(~~)。如果两个代表相同的时间(由于时区等,可能会不同的标称时间),则将智能匹配DateTime与另一个Datetime返回true。

对于序列,DateTime由于.later.earlier不是互通的事实而变得更加复杂,因此$date.later(:1month).later(:1month)不能保证这样做的结果与相同$date.later(:2month)

* ≥ DateTime.new(…)不同的原因Callable对象的智能匹配(从技术上讲,这是等效于anon sub $dt { $dt ≥ DateTime.new(…) }将左手参数传递给可调用对象的任何代码。如果您不确定100%确定序列会因达到精确值而终止,则是最好使用任何代码方法来确保值最终匹配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章