我想创建一个 DateTime
使用来自 this SOF post 的答案的 UTC 时区实例使用方法 DateTime#new_offset(0)
。但是,我无法在 DateTime
rdoc 或其父类的 rdoc Date 中找到它的定义。 .然而,DateTime
确实定义了方法:
DateTime.method_defined? :new_offset # => true
new_offset
没有出现在 rdoc 中一定有充分的理由。
最佳答案
为什么 DateTime#new_offset
没有出现在 DateTime
的 RDoc 中?
因为它是在父类Date
中定义的。
为什么 Date#new_offset
没有出现在 Date
的 RDoc 中?
因为它是 Date
类中的私有(private)方法(原因很明显,Date
对象没有时间部分,因此没有时区)并且是私有(private)的方法没有出现在 RDoc 中。
Compare definition in Ruby/ext/date/date_core.c
为什么 #new_offset
在 Date
类而不是 DateTime
中定义?
这是只有 Ruby 核心开发人员才能回答的实际问题。
我这里只能做一个假设:
在包含类 Date
和类 DateTime
的定义的 C 定义 date_core.c
中,定义了两个 C 结构,SimpleDateData
和 ComplexDateData
,镜像相关的 Ruby 类,其中 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
依赖于复制给定对象(结构),因此依赖于 dup_obj_with_new_offset
。因此,d_lite_new_offset
也可能归因于 Date
。
当然,会有另一种方法来概述 C 文件,但 Ruby 类的结果不会有所不同,我想这就是为什么没有人认为有理由更改当前的轮廓。
为什么 DateTime#new_offset
没有出现在 DateTime
的 RDoc 中?
回到最初的问题,我总结一下,有两件事我不明白,因此无法解释:我不知道为什么......
- 为 ruby-doc.org 创建 RDoc 的脚本的编写方式不会独立于类的所有公共(public)方法,而不管它们是如何定义的。
DateTime#new_offset
并不是被遗忘方法的唯一例子;还有很多其他的。仅在DateTime
中就有一些,例如。#hour
,#min
,#sec_fraction
。所有这些方法都是DateTime
对象的公共(public)方法,但不会出现在任何 RDoc 中...
Compare definition of DateTime methods - 对于索引,这些类中至少没有一些方法 stub 可以帮助 RDoc 脚本获取所有公共(public)方法。
关于ruby - 为什么 Ruby 的 DateTime.new_offset 不在 rdoc 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22018557/