日期::今天没有定义?

时间:2013-04-12 13:59:06

标签: ruby class date

为什么只有一些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的评论说它是一个stdlib而不是核心库,但核心甚至没有定义Date类,并且启动irc和-f(抑制读取.irbrc)以获得最小负载仍然会出现加载某种基础/ core Date class。

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

2 个答案:

答案 0 :(得分:9)

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

# 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.0中删除了空Date类:

  
      
  • RubyGems不再定义空的Date类。由Benoit提取请求#948   Daloze。
  •   

答案 1 :(得分:1)

补充@Stefan回答:

请注意,这已在rubygems的更高版本中删除。