raku - 如何死于未定义的值?
问题描述
我正在尝试在 Raku 中使用哈希,但是当我(故意)将一些假值放入其中时,例如
say %key<fake_key>;
我明白了
(Any)
但我希望程序在这种情况下死掉,就像 Perl 一样,因为这意味着重要数据丢失了。
例如,
#!/usr/bin/env perl
use strict;
use warnings 'FATAL' => 'all';
use autodie ':all';
my %hash;
print "$hash{y}\n";
从 5.26.1 开始产生
Use of uninitialized value $hash{"y"} in concatenation (.) or string at undefined.pl line 8.
Command exited with non-zero status 255
我怎样才能得到use warnings 'FATAL' => 'all'
和use autodie qw(:all)
Raku 中的等价物?
解决方案
Aiui你的问题是:
我正在寻找
use autodie qw(:all)
&use warnings 'FATAL' => 'all'
在乐
相当于autodie
Raku中的 Perl
use autodie qw(:all)
在 Perl 中的 Aiui是use fatal;
在 Raku 中。这是一个词法范围的效果(至少它在 Raku 中)。
autodie
Perl-to-Raku 简而言之指南中的部分解释了例程现在返回Failure
s 以指示错误。
fatal
pragma 使得从例程返回 a 会自动Failure
抛出一个包含Failure
. 除非您提供捕获它们的代码,否则这些包装Failure
s 的异常会自动消失。
相当于use warnings 'FATAL'
Raku中的 Perl
use warnings 'FATAL' => 'all'
在 Perl 中的 Aiui是CONTROL { when CX::Warn { note $_; exit 1 } }
在 Raku 中。这是一个词法范围的效果(至少它在 Raku 中)。
CONTROL
例外解释了这些是如何工作的。
CONTROL
异常是默认情况下所有异常的子集.resume
——当它们被抛出时,程序默认保持活动状态。
我提供的 Raku 代码(取自How could I make all warnings fatal?你链接到的)反而使CONTROL
异常死亡(由于exit
例程)。
返回到您当前的问题文本:
say %key<fake_key>; # (Any)
我希望程序在这种情况下死掉......
使用 Jonathan++ 的答案(使用put
,与 不同say
,它不会试图让您的程序保持活力)或 Scimon++ 的KeyRequired
答案,这将使访问不存在的密钥变得致命。
... 就像 Perl 一样...
仅当您使用use warnings 'FATAL' ...
时,就像 Raku 使用等效项一样。
...因为这意味着缺少重要数据。
通常这意味着丢失了不重要的数据,或者甚至在您尝试访问它的某些时候您不想定义的重要数据,因此 Perls 和 Raku 都默认保持您的程序处于活动状态并要求您告诉它您想要什么,如果你想要一些不同的东西。
您可以使用上述构造来获得您想要的精确结果,它们将被限制在给定的变量(如果您使用KeyRequired
角色)或语句(使用put
而不是say
)或词法范围(使用编译指示或CONTROL
块)。
推荐阅读
- bash - 错误后带有可选和非可选命令的 bash 陷阱
- r - 加载 .rda 文件并遍历其对象
- elasticsearch - 使用 Nlog 进行 Elasticsearch 配置
- wordpress - htaccess 给出 403 除了自己的 ip-address
- linux-kernel - nosmep 和 noexec=off 有什么区别
- php - {消息:“”,异常:“Symfony\Component\HttpKernel\Exception\NotFoundHttpException”,...}
- html - 文本级 HTML 元素是否用于语音搜索结果中的发音和辅助技术?
- c# - 如何使用 objectlistview 制作带有子标题的标题项
- inheritance - 如何从一个可解析的类派生
- javascript - 检查输入中的数字是否有效,然后添加它们