我想实现像3.days.ago和2.months.from_now这样的时间计算.
是可以将方法扩展到Int,还是运算符覆盖可以做到这一点?
是可以将方法扩展到Int,还是运算符覆盖可以做到这一点?
1.day.ago # equivalent to yesterday 1.day.from_now # equivalent to tomorrow
解决方法
要准确得到你的要求:
use MONKEY-TYPING; augment class Int { my class Date::Offset { has Pair $.offset is required; method ago () { Date.today.earlier( |$!offset ) } method from-now () { Date.today.later( |$!offset ) } } method days () { Date::Offset.new( offset => days => self ); } method months () { Date::Offset.new( offset => months => self ); } } say 1.days.ago; # 2017-03-13 say Date.today; # 2017-03-14 say 1.days.from-now; # 2017-03-15 say 1.months.ago; # 2017-02-14
既然我已经告诉你如何,请不要.您最终可能会以非常难以排除故障的方式影响您不想要的代码.
(有正当理由做这样的事情,但我不认为这是其中之一)
如果你想弄乱基本操作的发生方式,那就要用词汇方式来做.
{ sub postfix:« .days.ago » ( Int:D $offset ) { Date.today.earlier( days => $offset ) } sub postfix:« .days.from-now » ( Int:D $offset ) { Date.today.later( days => $offset ) } sub postfix:« .months.ago » ( Int:D $offset ) { Date.today.earlier( months => $offset ) } sub postfix:« .months.from-now » ( Int:D $offset ) { Date.today.later( months => $offset ) } say 1.days.ago; # 2017-03-13 say Date.today; # 2017-03-14 say 1.days.from-now; # 2017-03-15 say 1.months.ago; # 2017-02-14 } say 1.days.ago; # error