2013-12-16 2 views
1

find_team 클래스 메소드가 포함 된 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을 작성해야 만약 그렇지 않다면 객체. 나는 가장 명확하고 빠른 것을 찾기 위해 고심하고있다. ruby-ist하는 방법. 덜 장황하고 반복적 인 것에

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

나중에 참조 할 수 있도록이 전화를 t 그는 싱글 톤 패턴. – Doorknob

+0

Team.find_teams는 싱글 톤 메서드이지만 그 클래스에는 많은 인스턴스 메서드가 있다는 것을 알고 있습니다. 싱글 톤 방법에 특히 중요한이 질문에 대해서는 아무 것도 없습니다. –

답변

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

은 아마도 Ruby-ish 버전 일 것입니다. 또한 사용자 지정 방법을 향상시킬 수도 있습니다. 보조 노트로

, 당신은 Enumerable#find

class Team 
    @@all_teams = [] 

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

를 사용하도록 find_team 방법을 리팩토링 할 수 있습니다 그리고 당신은 또한 경우 인스턴스를 반환하는 새로운 방법을 추가 할 수 있습니다

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') 

t1에만 find_team 경우 방법에 새로운 Team 인스턴스를 할당은 nil를 반환합니다.

관련 문제