Я строю серию классов, которые наследуются от общего класса. Экземпляры классов создаются этим кодом ( поддерживает этого парня ):
def self.create(service, logger)
classified_name = service.name.to_s.split('_').collect! { |w| w.capitalize }.join << "Processor"
service_proc = Object.const_get(classified_name).new
service_proc.logger = logger ||= Rails::logger
ОК, так что все работало нормально, пока я не наткнулся на службу , в имени которой стояла цифра . Это может показаться плохой идеей, но в этом случае Процессор назван в честь внешней службы, у которой в имени есть цифра. Я решил сохранить эту цифру, чтобы избежать путаницы. «HToB» не имеет значения, в то время как «H2B» фактически имеет значение в контексте моего приложения.
Ну вдруг метод создания умер:
NoMethodError: undefined method `logger=' for #<H2bProcessor:0xb737f20>
ОК, странно. Имейте в виду, что у меня есть 4 других класса, которые строятся с помощью того же метода фабрики. Logger является свойством базового класса. Так что я немного возиться с этим, а потом решаю, что цифра, вероятно, все испортила. Поэтому я пытаюсь загрузить файл с и без цифры в имени класса:
>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
TypeError: superclass mismatch for class H2bProcessor
from /mnt/hgfs/kodiak/lib/processors/H2b_processor.rb:1:in `<top (required)>'
[...]
[change the 2 in the name to "To"]
[...]
>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
=> true
ОК, значит, проблема решена. Тем не менее, это действительно заставило меня задуматься: неужели наличие цифр в именах классов каким-то образом портит Ruby? Я немного погуглил, но не знал, что искать, такие вещи, как 'соглашение о присвоении имен, рубиновая цифра' не дал мне никаких результатов.