12

为什么只加载了 Date 类的某些方法而没有显式加载:

require 'date'

线?

例如:

irb(main):002:0> Date.today
NoMethodError: undefined method `today' for Date:Class
from (irb):2
from /Users/mwlang/.rvm/rubies/ruby-2.0.0-p0/bin/irb:16:in `<main>'

接着...

irb(main):003:0> require 'date'
=> true

导致...

irb(main):004:0> Date.today
=> #<Date: 2013-04-12 ((2456395j,0s,0n),+0s,2299161j)>

http://ruby-doc.org/stdlib-2.0/libdoc/date/rdoc/Date.html上的文档似乎没有为这种行为提供明确的解释。对#irc 的评论说它是一个标准库而不是核心库,但核心甚至没有定义 Date 类并使用 -f 启动 irc (抑制读取 .irbrc)以获得最小负载似乎仍然加载某种基础/核心日期类。

想要对正在发生的事情进行技术解释以及对解释这一点的 Ruby 文档的引用,以便在我从 Ruby 1.8.7 切换到 Ruby 2.0.0 时了解其他此类遭遇。

4

2 回答 2

10

出于兼容性原因Date,您看到的类在lib/rubygems/specification.rb中定义:

# date.rb can't be loaded for `make install` due to miniruby
# Date is needed for old gems that stored #date as Date instead of Time.
class Date; end

它是一个空类定义,不提供任何方法或功能。

如果在没有 RubyGems 的情况下启动 IRB,那么 Date 类就消失了:

$ ruby --disable-gems -S irb
irb(main):001:0> Date
NameError: uninitialized constant Date

更新

RubyGems 2.4.0Date中删除了空类:

  • RubyGems 不再定义空的 Date 类。Benoit Daloze 的拉取请求#948
于 2013-04-12T14:58:14.630 回答
1

补充@Stefan 回答:

请注意,这已在 ruby​​gems 的更高版本中被删除。

于 2015-01-08T14:14:24.787 回答