2010-07-27 2 views
1

Я пытаюсь создать экземпляры объектов разных типов путем итерации и проверки на достоверность. Мне нужен массив типов, поэтому я могу сделать что-то вроде этого:Массив типов в Ruby

def tryClasses(in) 
    types = [Foo::A, Foo::B, Foo::C] 

    types.each do |type| 
     a = type.new(in) 
     return a != null 
    end 
end 

Как создать и массив типов классов? Делая это таким образом я получаю NoMethodError (не определен метод «A» для Foo)

+0

как вы хотите, чтобы функция вела себя? заполнение массива и создание классов отлично. Вы хотите, чтобы он вернул первый класс, где новый преуспел? –

+0

Я только понял, что вы имеете в виду. Да, для учебных целей я просто хочу, чтобы он вернул true, когда он создает допустимый экземпляр A B или C. – willoller

+0

Что такое 'tryClasses (in)' и кто этот 'end' в конце? –

ответ

4

Помимо очевидных синтаксических ошибок (например, in это, неточности слово, и null пишется nil в Ruby), код, который вы показали должен работать как можно лучше, и действительно, когда я копирую &, вставьте его в мою установку Ruby. Это предполагает, конечно, что классы Foo::A, Foo::B и Foo::C фактически существуют. Если они этого не сделают, код явно не сработает.

Это, однако, совершенно не-Rubyish и нарушает почти все кодирования конвенции в книге:

  1. отступы 2 пространства
  2. имена методов snake_case, не camelCase
  3. явно проверки для равенство nil - нет-нет, просто вызывается #nil?
  4. try_classes не является точно определяющим намерение методом
  5. и WTF делает in означает?
  6. Рубистов много предпочитают методы более высокий порядок, более явное перекручивание

Вот более Rubyish версии коды Вы писали:

def can_create_object?(*args) 
    [Foo::A, Foo::B, Foo::C].none? do |klass| 
    klass.new(*args).nil? 
    end 
end 

Однако, обратите внимание, что я довольно уверен, что вся идея в корне ошибочно.

+2

lol okay - ты меня бросил, переосмыслив мои первоначальные предположения. Я вернусь с лучшим вопросом в другой день! – willoller

Смежные вопросы