gpt4 book ai didi

data-structures - 如何防止 Nil 将容器恢复为其默认值?

转载 作者:行者123 更新时间:2023-12-04 04:28:16 25 4
gpt4 key购买 nike

我正在实现一个简单的链表并表示没有下一个节点的事实,我使用值 Nil .问题是,当分配给容器时,Nil将尝试将容器恢复为其默认值,这意味着我需要使用容器的默认值或 Any以确定是否已到达链表的末尾。不过,我还是想用 Nil (如果只是为了它的明确意图)并且没有其他值来测试代码中下一个节点的不存在(例如, until $current === Anylast if $current-node === Any; )。对于某些情况:

class Node {
has $.data is rw is required;
has $.next is rw = Nil;
}

class UnorderedList {
has $!head = Nil;

method add(\item --> Nil) {
my $temp = Node.new: data => item;
$temp.next = $!head;
$!head = $temp;
}

method size(--> UInt) {
my $current = $!head;
my UInt $count = 0;

until $current === Any { # <=== HERE
$count += 1;
$current .= next;
}

return $count;
}

method gist(--> Str) {
my $current-node = $!head;
my $items := gather loop {
last if $current-node === Any; # <=== HERE
take $current-node.data;
$current-node .= next;
}

$items.join(', ')
}
}

最佳答案

这有点像问“我打伞的时候怎么还会有雨落在我的头上”。 :-) 主要原因Nil Raku 中的存在是为了提供一个函数可以在软故障时返回的值以产生结果,如果分配到任何支持未定义(或默认)的容器中,这将是安全的。
因此,可以编写一个函数 func可以返回Nil ,它只会为来电者工作 my SomeType $foo = func()或给来电者 my OtherType $bar = func() .
虽然有 is default(Nil)技巧,我强烈建议使用其他一些值作为您的哨兵。在您不希望它提供的主要行为的情况下尝试使用语言功能通常不会顺利进行。Node类型对象本身将是一个合理的选择。因此这个:

has $!head = Nil;
变成:
has Node $!head;
测试变成:
until $current === Node {
不过,我可能会写成:
while $current.defined {
它还支持 Node 的子类化.另一方面,如果我知道 Node是我的类的一个实现细节,我觉得可以安全地使用依赖默认的 bool 化语义来消除困惑:
while $current {
同时,这:
last if $current-node === Any;
可以变成:
last without $current-node;
或者为了一致性,如果选择“依赖 bool 化”方​​法:
last unless $current-node;
最后,如果 Node只是一个实现细节,我会把它移到里面 UnorderedList并制作 my范围。

关于data-structures - 如何防止 Nil 将容器恢复为其默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62742323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com