我想使用DateTime
使用方法DateTime#new_offset(0)
的答案为UTC时区创建this SOF post个实例。但是,我无法在DateTime
rdoc或其父类Date的rdoc中找到它的定义。然而,DateTime
确实有定义的方法:
DateTime.method_defined? :new_offset # => true
必须有充分的理由说明new_offset
没有出现在rdoc中。
答案 0 :(得分:2)
为什么DateTime#new_offset
没有出现在DateTime
的RDoc中?
因为它是在父类Date
中定义的。
为什么Date#new_offset
没有出现在Date
的RDoc中?
因为它是类Date
中的私有方法(出于显而易见的原因,因为,Date
- 对象没有时间部分,因此没有时区)并且私有方法不会出现在RDoc中。
Compare definition in Ruby/ext/date/date_core.c
为什么在#new_offset
班而不是Date
中定义了DateTime
?
这是一个实际问题,只能由Ruby核心开发人员来回答
我只能在这里做一个假设:
在包含类date_core.c
和类Date
的定义的C-definition DateTime
中,定义了两个C-structs SimpleDateData
和ComplexDateData
,镜像有问题的Ruby类,其中ComplexDateData
包含SimpleDateData
包含的所有字段。这两个结构的唯一原因似乎是内存使用,以使Date
- 对象占用的内存少于DateTime
- 对象。除此之外,所有函数都被编写为与两个结构一起使用并且没有被复制,这是显而易见的原因(例如代码维护),特别是因为两个结构都基于内部表示日期的相同逻辑。
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中?
回到最初的问题,我总结说,有两件事我不理解,因而无法解释:我不知道为什么......
DateTime#new_offset
不是被遗忘方法的唯一例子;还有很多其他的。仅在DateTime
中就有一些,例如。 #hour
,#min
,#sec_fraction
。所有这些方法都是DateTime
- 对象的公共方法,但不会出现在任何RDoc ...中
Compare definition of DateTime methods 答案 1 :(得分:0)
它在Date类中定义。以下是来源的定义:
# d.new_offset([offset=0]) -> date
#
# Duplicates self and resets its offset.
#
# d = DateTime.new(2001,2,3,4,5,6,'-02:00')
# #=> #<DateTime: 2001-02-03T04:05:06-02:00 ...>
# d.new_offset('+09:00') #=> #<DateTime: 2001-02-03T15:05:06+09:00 ...>
def new_offset(p1 = v1)
#This is a stub, used for indexing
end