Perl 6中为字符串混入Dateish角色报错,求原因与解决办法
为啥给字符串混入Dateish角色行不通?
咱先把结论放前面:直接给普通字符串(Str类型)混入Dateish角色确实走不通,这和Dateish角色的设计初衷有关——它是为Date、DateTime这类核心日期时间类型设计的扩展,不是给普通字符串用的。下面拆解你遇到的问题,再给你靠谱的解决办法:
1. 第一个错误:gist方法调用歧义
你看到的Ambiguous call to 'gist(Str+{Dateish}: )'错误,本质是方法冲突了:
- 字符串本身自带一个
gist方法(Perl 6里所有类型都有这个方法,用来生成友好的字符串表示) - Dateish角色也提供了自己的
gist实现
当你把Dateish混到Str上后,say $date会隐式调用gist,这时候Perl 6犯了难:到底用哪个版本的gist?所以直接抛出了歧义错误。
2. 第二个错误:Bridge方法调用失败
当你尝试用Dateish的方法(比如.week-year)时,出现的Invocant of method 'Bridge' must be an object instance of type 'Int'错误,是因为Dateish的很多方法依赖底层的日期类型实现。它会尝试通过Bridge方法把当前对象转换成具体的日期对象,但字符串根本没有这个能力,自然就报错了。
正确姿势:直接用DateTime/Date对象,别折腾字符串
其实你完全没必要绕弯子——你已经能通过".".IO.changed.DateTime拿到DateTime对象了,直接用这个对象就行,所有Dateish的方法它都原生支持:
示例代码:
# 先拿到当前目录的修改时间DateTime对象 my $mod-time = ".".IO.changed.DateTime; # 输出你想要的yyyy-mm-dd格式字符串 say $mod-time.yyyy-mm-dd; # 直接调用Dateish的方法,比如获取周所在的年份 say $mod-time.week-year; # 如果需要Date对象,直接转换就行 my $mod-date = $mod-time.Date; say $mod-date.day-of-week; # 输出星期几的数字
为啥小时相关对象混没问题?
你之前给小时相关对象混入成功,大概率是因为那个对象本身就是时间相关的类型(比如Duration的组件、或者某个时间单位对象),这些类型和Dateish角色的接口是兼容的,混入后不会有方法冲突或依赖缺失的问题,自然就能正常工作。
内容的提问来源于stack exchange,提问作者jjmerelo
相关产品推荐
相关产品推荐

