如果我有一个Str类型的对象,并且我想将它强制转换为Int,那么我的理解是我可以通过在Str-object上调用Int方法来实现这一点,如下所示:
"100".Int
我(我想)知道我可以这样做,因为https://docs.perl6.org/type/Str处的Str类型文档列出了Int-method。现在,为了将这个新创建的Int强制转换为Complex类型的对象,我尝试了以下强制:
"100".Int.Complex
哪个有效:-)所以没问题。除了我无法弄清楚它为何起作用。 https://docs.perl6.org/type/Int处的Int类型文档未列出方法Complex。我确实为ComplexStr类找到了一个具有此名称的方法,但我不知道这是否与我的Int有关,或者没有。
所以问题是:上述强制如何运作?复合方法来自何处?我怎么能知道我可以在尝试之前在Int-object上调用它?
答案 0 :(得分:12)
这仅仅是文档不完整的情况。
您可以随时通过调用.^methods
找到对象支持的方法:
perl6 -e '$_>>.name.join(", ").say for 123.^methods.sort(*.name).rotor(5 => 0, :partial)'
ACCEPTS, Bool, Bridge, Capture, Complex
DUMP, FatRat, Int, Num, Numeric
Range, Rat, Real, Str, WHICH
abs, acos, acosec, acosech, acosh
acotan, acotanh, asec, asech, asin
asinh, atan, atan2, atanh, base
ceiling, chr, cis, conj, cos
cosec, cosech, cosh, cotan, cotanh
exp, expmod, floor, gist, is-prime
isNaN, log, log10, lsb, msb
narrow, new, perl, polymod, pred
rand, roots, round, sec, sech
sign, sin, sinh, sqrt, succ
同时,我pushed a commit to the docs repo添加了丢失的方法。该网站已经通过更改重新生成:https://docs.perl6.org/type/Int#(Real)_method_Complex
答案 1 :(得分:3)
(这是一个扩展的评论而非答案。我只知道Perl 5.)
来自https://docs.perl6.org/type/Cool:
Cool中的方法将调用者强制转换为更具体的类型,然后 在该类型上调用相同的方法。例如Int和Str 继承自Cool,并在Int上调用方法substr转换 首先是整数到Str。
123.substr(1, 1); # '2', same as 123.Str.substr(1, 1)
因此,123.substr(1, 1)
似乎与Cool(123).substr(1, 1)
更为传统的符号,然后被重写为Str(123).substr(1, 1)
,因为Str
继承自Cool
(如经典的OOP落后了)。
以类似的方式,似乎"100".Int.Complex
与Cool("100").Int.Complex -> Int("100").Complex -> 100.Complex -> Cool(100).Complex -> Complex(100)
类似。