我想使用
this SOF post中使用DateTime#new_offset(0)方法的答案为UTC时区创建一个
DateTime
实例.但是,我无法在DateTime rdoc或其父类
Date的rdoc中找到它的定义.但是,DateTime确实具有定义的方法:
DateTime.method_defined? :new_offset # => true
必须有一个很好的理由说明为什么new_offset没有出现在rdoc中.
最佳答案 为什么DateTime#new_offset不出现在DateTime的RDoc中?
因为它是在父类Date中定义的.
为什么Date#new_offset不出现在Date的RDoc中?
因为它是类Date中的私有方法(由于显而易见的原因,因为,Date对象没有Time-part,因此没有Timezone),并且私有方法不会出现在RDoc中.
Compare definition in Ruby/ext/date/date_core.c
为什么在类Date而不是DateTime中定义#new_offset?
这是一个实际的问题,只能由Ruby核心开发人员来回答.
我只能在这里做一个假设:
在包含类Date,类DateTime定义的C-definition date_core.c中,定义了两个C-struct,SimpleDateData和ComplexDateData,镜像有问题的Ruby-classes,其中ComplexDateData包含SimpleDateData包含的所有字段.这两个结构的唯一原因似乎是内存使用,以使Date-object占用比DateTime-object更少的内存.除此之外,所有函数都被编写为与两个结构一起使用并且没有被复制,这是显而易见的原因(例如代码维护),特别是因为两个结构都基于内部表示日期的相同逻辑.
Compare how most functions check the internal data-type with: if (simple_dat_p…
特别地,函数dup_obj_with_new_offset是C函数,其也被(稍后的)Ruby类Date的函数使用,例如.方法#httpdate和(可能由于这个原因)归因于类Date.
Compare RDoc for Date#httpdate
与其他函数一样,d_lite_new_offset依赖于复制给定对象(struct),因此依赖于dup_obj_with_new_offset.因此,d_lite_new_offset可能也归因于Date.
当然,还有另一种方法来概述C文件,但Ruby类的结果不会有所不同,我认为,这就是为什么没有人看到改变当前大纲的理由.
为什么DateTime#new_offset不出现在DateTime的RDoc中?
回到最初的问题,我总结说,有两件事我不理解,因而无法解释:我不明白为什么……
>为ruby-doc.org创建RDoc的脚本是以一种方式编写的,它不会像定义它们的方式那样获取类的所有公共方法. DateTime#new_offset不是被遗忘方法的唯一例子;还有很多其他的.仅在DateTime中就有一些,例如. #hour,#min,#sec_fraction.所有这些方法都是DateTime对象的公共方法,但不会出现在任何RDoc中……
Compare definition of DateTime methods
>对于索引,这些类中至少没有一些方法存根可以帮助RDoc脚本获取所有公共方法.