2013-12-16 3 views
1

У меня есть класс Team, который содержит метод класса find_team. Метод возвращает Team объекта, если он найден, или nil, если объект не найден:Как условно назначить переменные Ruby экземплярам объектов

class Team 
    @@all_teams = [] 

    def self.find_team(name) 
    index = @@all_teams.find_index { |t| t.name == name } 

    if index.nil? 
     nil 
    else 
     @@all_teams[index] 
    end 
    end 
end 

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

t1 = Team.find_team("Some Team") ? Team.find_team("Some Team") : Team.new("Some Team") 

t2 = Team.find_team("Some Other Team") 
t2 ||= Team.new("Some Other Team") 

t3 = if Team.find_team("Another Team") 
     Team.find_team("Another Team") 
    else 
     Team.new("Another Team") 

Я предпочитаю второй пример, так как это менее многословным и повторяющиеся, но мне интересно, если есть какая-то хитрость Руби я пропускаю в этом сценарии.

+0

Для справки в будущем и Google это называется t он одиночный узор. – Doorknob

+0

Я знаю, что Team.find_teams - это метод singleton, но этот класс также имеет множество методов экземпляра. В этом вопросе нет ничего особенного, особенно для синглтон-методов. –

ответ

3
t1 = Team.find_team("Some Team") || Team.new("Some Team") 

, вероятно, самая версия Ruby-ish. Вы также можете рассмотреть возможность улучшения своего пользовательского метода.

В качестве примечания, вы можете реорганизовать метод find_team использовать Enumerable#find

class Team 
    @@all_teams = [] 

    def self.find_team(name) 
    @@all_teams.find { |t| t.name == name } 
    end 
end 

И вы также можете добавить новый метод, который возвращает экземпляр, если ни один

class Team 
    @@all_teams = [] 

    def self.find_team(name) 
    @@all_teams.find { |t| t.name == name } 
    end 

    def self.find_or_build_team(name) 
    find_team(name) || Team.new(name) 
    end 
end 

так, что вы будете просто позвоните

Team.find_or_build("Some Team") 
+0

Это действительно элегантное решение. Благодарю. –

1

Как насчет:

t1 = Team.find_team('Some Team') || Team.new('Some Team') 

Это присваивает новый экземпляр Team в t1 только если find_team метод возвращает nil.

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