2017-03-14 18 views
5

Tôi muốn thực hiện phép tính thời gian như 3.days.ago2.months.from_now. Có thể mở rộng phương pháp để Int, hoặc điều hành trọng tài có thể làm điều này?Triển khai 3.days.ago trong Perl6

1.day.ago  # equivalent to yesterday 
1.day.from_now # equivalent to tomorrow 
+0

Bạn đã thử những gì cho đến nay? – canadiancreed

Trả lời

7

Để có được chính xác những gì bạn đang yêu cầu:

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 

Bây giờ tôi đã cho bạn thấy làm thế nào, xin vui lòng không. Bạn có thể sẽ ảnh hưởng đến mã mà bạn không có ý định, theo cách rất khó khắc phục.
(Có lý do chính đáng để làm điều gì đó như thế, nhưng tôi không nghĩ đây là một trong số đó)

Nếu bạn muốn làm rối loạn các hoạt động cơ bản xảy ra, hãy làm điều đó một cách lexically.

{ 
    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 
7

Cách cơ bản để mở rộng một lớp hiện có, là để tăng thêm nó:

use MONKEY-TYPING; 
augment class Int { 
    method day() { "day" } 
} 
say 42.day 

Từ đó bạn có thể có phương pháp "ngày" tạo ra một đối tượng mà có thể xử lý "trước" và " from_now "phương pháp.

Xin lưu ý rằng, có vẻ như bạn sẽ cần suy nghĩ một chút về API của mình: trong dòng đầu tiên, ngày thứ 1. xuất hiện để đề cập đến ngày hôm nay, trong khi dòng thứ hai chỉ "from_now" dường như có chức năng đó .

Xin lưu ý rằng tại thời điểm này, các lớp con không biết về các siêu lớp đang được tăng cường: đây là sự cố đã biết. Cách duy nhất xung quanh rằng tại thời điểm này là để tái soạn lớp con bạn cần sau khi làm tăng lớp cha của họ:

use MONKEY-TYPING; 
augment class Cool { # Int is a subclass of Cool 
    method day() { "day" } 
} 
BEGIN Int.^compose; # make sure Int knows about ".day" 
say 42.day 
5

Nó có thể là thú vị để use MONKEY-TYPING, nhưng nếu bạn thực sự chỉ muốn tính toán ngày tháng, sau đó xin vui lòng chỉ sử dụng được xây dựng trong Date đối tượng:

put Date.today;     # 2017-03-23 
put Date.today.earlier(day=>3); # 2017-03-20 
put Date.today.later(month=>3); # 2017-06-23 

(tôi biết về trying clever syntax, nhưng tôi vui mừng khi được talked out of it).

Các vấn đề liên quan