我在Perl中编写链接列表。链表具有链接在一起的节点。每个节点都有一个值。此值可以是任何值,对象,字符串,数字,引用等。
我的问题是如何比较平等的价值。在编写find函数时,我需要在链表中找到给定的值。但是,由于价值可以是任何值,我不知道如何实施比较操作。
这是我到目前为止查找操作的相关代码片段:
sub find {
my $val = shift; # we're looking for this value
my $node = $LinkedList->{head}; # we start looking at the beginning of LL
while (defined $node) {
# this is the relevant part, how do I compare $val to $node->{val}
if ($node->{val} == $val) {
return $node;
}
if ($node->{val} eq $val) {
return $node;
}
$node = $node->{next};
}
}
使用==
和eq
的两张支票是否足够? (这会处理引用,对象等吗?)
答案 0 :(得分:3)
你问错了问题。你不需要通用的比较功能;您只需要提供特定于任务的比较功能。
如果链接列表中的数据类型存在显着差异,则必须能够以某种方式区分它们,否则您将无法使用列表中的信息。究竟如何区分它们并不重要;重要的是你必须已经知道如何这样做。
只需将您已有的知识编码到传递给find
或构造函数的比较函数中。
sub find {
my ($self, $is_equal, $arg) = @_;
my $ap = do { no strict 'refs'; \*{caller().'::a'} }; local *$ap;
my $bp = do { no strict 'refs'; \*{caller().'::b'} }; local *$bp;
*$ap = \$arg;
for (my $node = $self->{head}; $node; $node = $node->{next}) {
*$bp = \( $head->{val} );
return $node if $is_equal->();
}
return undef;
}
使用示例:
sub is_same_flight {
# Returns true if $a and $b represent the same flight.
...
}
$flights->find(\&is_same_flight, $flight);
或
my $is_same_flight = sub {
# Returns true if $a and $b represent the same flight.
...
};
$flights->find($is_same_flight, $flight);