Я создаю серию классов, которые наследуются от общего класса. Экземпляры классов создаются с помощью этого кода (реквизит этому парню):
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» действительно имеет значение в контексте моего приложения.
Ну и вдруг метод create умер:
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? Я немного погуглил, но не знал, что искать, такие вещи, как «соглашение об именах ruby numeral ' не дало мне никаких результатов.
block/yieldпри вызове метода. - person the Tin Man   schedule 23.01.2012