首页 > 解决方案 > 如何死于未定义的值?

问题描述

我正在尝试在 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 中的等价物?

标签: raku

解决方案


Aiui你的问题是:

我正在寻找use autodie qw(:all)&use warnings 'FATAL' => 'all'在乐

相当于autodieRaku中的 Perl

use autodie qw(:all)在 Perl 中的 Aiui是use fatal;在 Raku 中。这是一个词法范围的效果(至少它在 Raku 中)。

autodiePerl-to-Raku 简而言之指南中的部分解释了例程现在返回Failures 以指示错误。

fatalpragma 使得从例程返回 a 会自动Failure抛出一个包含Failure. 除非您提供捕获它们的代码,否则这些包装Failures 的异常会自动消失。

相当于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块)。


推荐阅读