我的班级名称与Ruby相冲突

时间:2014-01-05 23:18:59

标签: ruby class conflict

我的模块中有一个名为“Date”的类。但是当我想利用与ruby打包的Date类时,它会使用我的Date类。

module Mymod
  class ClassA
    class Date < Mymod::ClassA
      require 'date'

      def initialize
        today = Date.today # get today's date from Ruby's Date class
        puts "Today's date is #{today.to_s}"
      end
    end
  end
end

Mymod::ClassA::Date.new

运行它的输出是

test.rb:7:in `initialize': undefined method `today' for Mymod::ClassA::Date:Class (NoMethodError)

有什么方法可以从我自己的类中引用ruby的Date类,也称为“Date”?

3 个答案:

答案 0 :(得分:8)

def initialize
        today = ::Date.today # get today's date from Ruby's Date class
        puts "Today's date is #{today.to_s}"
      end

What is double colon in Ruby

答案 1 :(得分:5)

在您的代码Date中隐式查找来自Date类声明 Date < Mymod::ClassA类范围 - 此Date声明不包括方法today

为了引用Ruby的核心Date类,您需要指定您正在查找根范围。通过在Date前加:: scope resolution operator

作为前缀来执行此操作
today = ::Date.today # Resolves to `Date` class in the root scope

然而,实际上,在Ruby核心类中,应该避免命名冲突/冲突。它们在考虑惯例的情况下命名,并且将自定义类命名为其他而不是与核心类相同的名称通常不那么令人困惑/更具描述性。

答案 2 :(得分:0)

我同意其他人的意见,你应该更改班级名称,但你可以这样做:

module Mymod
  require 'date'
  RubyDate = Date
  Date = nil      
  class ClassA
    class Date < Mymod::ClassA
      def initialize
        today = RubyDate.today # get today's date from Ruby's Date class
        puts "Today's date is #{today.to_s}"
      end
    end
  end
end

Mymod::ClassA::Date.new # => Today's date is 2014-01-05