代码之家  ›  专栏  ›  技术社区  ›  Pistol

什么时候宇宙飞船的操作者被用在一个分类之外?

  •  9
  • Pistol  · 技术社区  · 15 年前

    这是一个最佳实践问题。

    我只见过在数字排序例程中使用的perl spaceship运算符(<=>)。但在其他情况下似乎有用。我就是想不出什么实际用途。

    有人能给我举个例子说明什么时候它可以在Perl之外使用吗?

    3 回复  |  直到 14 年前
        1
  •  7
  •   P Shved    15 年前

    我正在为机器人乔写一个控制系统,他想去机器人玛丽那里给她充电。它们沿着直线上的整数点移动。乔起价J美元,每个时间单位可以向任何方向走1米。玛丽以百万美元的价格站着一动不动——她需要好好充电!控制程序如下所示:

    while ($m != $j) {
        $j += ($m <=> $j);
    }
    
        2
  •  5
  •   daotoad    15 年前

    这个 <=> 操作员将有助于 binary search algorithm . 大多数编程语言没有执行三向比较的运算符,因此每次迭代都需要进行两次比较。用 <= & gt; 你只能做一个。

    sub binary_search {
        my $value = shift;
        my $array = shift;
        my $low   = 0;
        my $high  = $#$array;
    
        while ($low <= $high) {
            my $mid = $low + int(($high - $low) / 2);
    
            given ($array->[$mid] <=> $value) {
                when (-1) { $low  = $mid + 1 }
                when ( 1) { $high = $mid - 1 }
                when ( 0) { return $mid      }
            }
        }
    
        return;
    }
    
        3
  •  2
  •   Ether    15 年前

    在任何一种比较方法中。例如,您可能有一个复杂的对象,但仍然有一个已定义的“顺序”,因此您可以为它定义一个比较函数(您没有 在排序方法中使用,尽管它很方便):

    package Foo;
    
    # ... other stuff...
    
    # Note: this is a class function, not a method
    sub cmp
    {
        my $object1 = shift;
        my $object2 = shift;
    
        my $compare1 = sprintf("%04d%04d%04d", $object1->{field1}, $object1->{field2}, $object1->{field3});
        my $compare2 = sprintf("%04d%04d%04d", $object2->{field1}, $object2->{field2}, $object2->{field3});
        return $compare1 <=> $compare2;
    }
    

    当然,这是一个完全人为的例子。然而,在我公司的源代码中,我几乎完全找到了上面的内容,用于比较用于保存日期和时间信息的对象。

    我能想到的另一个用途是用于统计分析——如果一个值反复针对一系列值运行,您可以判断该值是否高于或低于集合的算术中位数:

    use List::Util qw(sum);
    # $result will be
    #   -1 if value is lower than the median of @setOfValues,
    #    1 if value is higher than the median of @setOfValues,
    #    0 if value is equal to the median
    my $result = sum(map { $value <=> $_ } @setOfValues);
    

    还有一个,来自 wikipedia :“如果两个参数无法比较(例如其中一个是NaN),则运算符返回Undef。”即,您可以确定两个数字是否同时是一个数字,尽管我个人会选择不那么神秘的数字。 Scalar::Util ::看起来像“数字”。

    推荐文章