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

ruby如何比较两个日期(或任何其他对象)

  •  0
  • msangel  · 技术社区  · 3 年前

    我只有一行代码,但它给我带来了很多问题。

    代码:

    Time.at(100).send(:>=, Time.at(200))
    

    主要问题:在哪里实施 :>= 操作员在哪里?

    从我在资料中看到的情况来看,没有实施 :>= 操作员在 time.c 是吗?如何知道从那里实施哪种方法 :>= ? 文档中仅描述了一种比较方法: <=> ,但目前还不清楚电话是怎么打来的 :<=> 被翻译成 :>= 。请描述呼叫跟踪如何 :>= 在c级被调用。

    2 回复  |  直到 3 年前
        1
  •  2
  •   spickermann    3 年前

    这个 >= 方法在 Comparable 模块。引用文件:

    Comparable混入用于对象可以排序的类。类必须定义 <=> 运算符,它将接收器与另一个对象进行比较,返回小于0的值、返回0或返回大于0的值,具体取决于接收器是小于、等于还是大于其他对象。如果另一个对象不可比,那么 <=> 运算符应返回nil。可比用途 <=> 实现传统的比较运算符( < , <= , == , >= ,以及 > )以及两者之间的方法?。

    还有 Time 类包括 可比 模块。

        2
  •  1
  •   tadman    3 年前

    在Ruby中 x.y(...) 相当于 x.send(y, ...) 但像 x + y 最终也被转化为 x.send(:+, y) 大多数操作最终都是对某种对象的方法调用。

    这个 >= 运算符是一个语法元素,但它是通过调用 >= 左侧元素上的方法。这就是代码:

    Time.at(100).send(:>=, Time.at(200))
    

    在哪里? :>= 符号是否代表 >= ,但您也可以使用 '>=' 相反,即使由于String开销而效率较低。

    无论如何,这相当于直接使用运算符:

    Time.at(100) >= Time.at(200)
    

    也就是说没有 :>= 操作员。这是 >= 操作人员 由代表 这个 :>= 符号。

    主流Ruby的很多内部结构 "MRI" version of Ruby 出于性能原因,用C实现。这意味着您无法轻易发现该方法的实现位置:

    Time.method(:>=).source_location
    # => nil
    

    这是因为不涉及Ruby代码,而是一个“内部”C函数。

    值得注意的是,你不必实现这样的方法 >= 直接来说,有一些捷径是自动得出的,尤其是 Comparable 如果有 <=> 方法定义如下:

    可比用途 <=> 实现传统的比较运算符( < , <= , == , >= ,以及 > )以及方法 between? .

    换句话说,如果你实现了,你就可以免费获得这些 <=> include Comparable 在你的课堂上。时间是否包括可比性?这很容易发现:

    Time.ancestors
    # => [Time, Comparable, Object, Kernel, BasicObject]
    

    确实如此。

    因此,寻找一个特定的 >= 方法是一个失败的原因,它是自动生成的。

    Ruby C扩展的定义方式是编写C代码,然后使用如下绑定桥接方法:

    rb_define_method(rb_cTime, "<=>", time_cmp, 1);
    

    这与哪里有关 time_cmp() 功能与 rb_cTime 阶级代表。您也可以在文件中找到该函数的源代码。