Wait the light to fall

🎄 5/25. 在 Raku 中今天是什么日期?

焉知非鱼

欢迎来到这个可爱的 Raku One-Liner Advent Calendar 的第5天!

今天,我们将回答今天是什么日期的问题(如果你愿意的话,明天我们可以谈论回文)。

因此,要打印答案,您可以使用以下Raku代码行:

DateTime.now.yyyy-mm-dd.say

它看起来显而易见,并以YYYY-MM-DD的格式打印日期。 好的部分是 DateTime 类可以直接使用,例如,您不需要像在Perl 5中那样包含模块。

$ raku -e'DateTime.now.yyyy-mm-dd.say'
2018-12-05

正如您在日历的前几天已经看到的那样,链式方法调用是典型的Raku惯用法。 另一种选择是使用say作为子例程并使用括号来标记方法调用:

say(DateTime.now().yyyy-mm-dd());

这段代码也有效; 它完全正确,但看起来很重。

您还应该注意并告诉您的朋友,在Raku中,您可以在标识符中使用短划线和撇号。

好吧,也许使用撇号不是一个好主意,但是在Raku的源代码中已经广泛使用了连字符。只需确保在表达式中的减法运算符周围放置空格以避免解析中的任何冲突。

浏览源代码阅读文档,您将找到以相同方式命名的另一种方法: hh-mm-ss。 我打赌你明白它的作用。

> DateTime.now.hh-mm-ss.say
00:12:01

请注意,对于不同的输出格式,您将找不到类似的方法,例如 dd-mm-yyhh-mm。 请改用 formatter 程序。 它不是方法,而是在 Datish 角色中定义的属性。 DateTime 类中有一个默认格式化程序,但您可以通过为构造函数提供自己的子例程来重新定义它,例如:

DateTime.now(formatter => -> $dt {
    sprintf '%02d.%02d.%04d',
    $dt.day, $dt.month, $dt.year
}).say

这里的格式化程序接收一个带有参数 $dt 的匿名子例程(由箭头引入)。

我希望这段代码与我们的初始单行打印相同的日期,因为您最有可能在一天内阅读整篇文章。

不过,明天见一下测试回文的代码!