Мое имя класса конфликтует с именем Руби.
В моем модуле есть класс, который называется "дата". Но когда я хочу использовать класс 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 ответа:
def initialize today = ::Date.today # get today's date from Ruby's Date class puts "Today's date is #{today.to_s}" end
В коде
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