首页 > 解决方案 > Dateish 字符串的问题

问题描述

此代码(用于检查当前目录的更改时间戳):

my $date = ".".IO.changed.DateTime.yyyy-mm-dd but Dateish; 
say $date;

产生错误:

«Ambiguous call to 'gist(Str+{Dateish}: )'; these signatures all match:␤:  (Str:D: *%_)␤:(Dateish:D:   │ avalenn
                 | *%_)␤  in block <unit> at <tmp> line 1␤␤»

没有Dateish混合,字符串很简单2018-05-12。使用任何其他类型的Dateish函数,例如.week-year也会产生不同的错误:

«Str+{Dateish}␤Invocant of method 'Bridge' must be an object instance of type 'Int', not a type      │ a3r0
                 | object of type 'Int'.  Did you forget a '.new'?␤  in block <unit> at <tmp> line 1␤␤»

这是否仅仅意味着您不能将字符串与 Dateish 混合在一起?我已经做了几个小时没有问题的类似事情。

标签: datemixinsraku

解决方案


要回答你的问题,我们应该看看这个角色:

my role Dateish {
    has Int $.year;
    has Int $.month;     # should be int
    has Int $.day;       # should be int
    has Int $.daycount;
    has     &.formatter;

    ...
    multi method Str(Dateish:D:) {
        &!formatter ?? &!formatter(self) !! self!formatter
    }
    multi method gist(Dateish:D:) { self.Str }
    ...
}

所以,角色Dateish有几个属性,方法使用这些属性来计算它们的返回值。

当你这样做时$some-string but Dateish,你没有做任何事情来初始化属性,因此使用它们的方法调用(可能间接地)以有趣的方式失败。

你如何Dateish从一个那里得到一个对象DateTime?好吧,DateTime已经是一个,或者Date如果这是你想要的,你可以强制:

my $date = ".".IO.changed.DateTime.Date; say $date

您也可以尝试通过提供所有属性来实例化 a ,但我认为与按预期Dateish使用相比没有任何优势。Date


推荐阅读