Мое имя класса конфликтует с именем Руби.


В моем модуле есть класс, который называется "дата". Но когда я хочу использовать класс Date, упакованный с ruby, он использует мой класс 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 из моего собственного класса, также называемого "дата"?

3 3

3 ответа:

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

Что такое двойное двоеточие в Ruby

В коде Date неявно ищет объявление класса Date из в области видимости класса Date < Mymod::ClassA – это объявление Date не включает метод today.

Чтобы ссылаться на основной класс Ruby Date, необходимо указать, что вы смотрите в корневой области. Сделайте это, добавив префикс Date к :: оператор разрешения области действия :

today = ::Date.today # Resolves to `Date` class in the root scope

Однако , на самом деле, вы должны избегать именования конфликтов / коллизий, когда это происходит к основным классам Ruby. Они называются с учетом соглашения, и обычно менее запутанно/более описательно называть пользовательские классы чем-то другим, чем то же имя, что и основной класс.

Я согласен с другими, что вы должны изменить название вашего класса, но вы могли бы сделать это:

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