2015-09-20 8 views
0

Я новичок в Ruby и работаю над упражнением, в котором спортивная команда (до 10 человек) должна иметь как минимум 2 мужчин и 2 женщины. Я создал класс Player, где определяется пол игрока и класс Team, где я добавляю этих игроков в массив переменных экземпляра @team (который создается при инициализации Team).Доступ к массиву переменных переменных с использованием IRB

Я разместил свой полный код в нижней части этого запроса.

Я надеюсь, что кто-то может помочь мне на следующее:

(1) Что я печатаю в IRB, чтобы иметь возможность конкретно вспомнить/maniuplate переменного массива экземпляра @team (который хранит все игрок). Я хочу позже перебрать массив или извлечь первый элемент в массиве (@ team.first не работает)

(2) У меня возникли трудности с написанием кода, чтобы определить, не менее двух мужчин и женщин находятся в переменной экземпляра @team. Лучший код, который я получил в классе Team, был следующим: но он сообщает, что @team - это nilclass.

def gender_balance 
    @team.select{|player| player.male == true } 
end 

Я исследовал интернет и пробовал различные комбинации для ответа - без успеха.

Непосредственно ниже приведены команды IRB, которые я набрал для создания и добавления игроков в команды. Ниже ниже мой код для Team (который содержит метод оценки, имеет ли он правильный гендерный микс) и Players.

irb(main):001:0> team = Team.new 
=> #<Team:0x007fd8f21df858 @team=[]> 

irb(main):002:0> p1 = Player.new 
=> #<Player:0x007fd8f21d7b08 @male=true> 

irb(main):003:0> p1.female_player 
=> false 

irb(main):004:0> p2 = Player.new 
=> #<Player:0x007fd8f21bff58 @male=true> 

irb(main):005:0> team.add_player(p1) 
=> [#<Player:0x007fd8f21d7b08 @male=false>] 

irb(main):006:0> team.add_player(p2) 
=> [#<Player:0x007fd8f21d7b08 @male=false>, #<Player:0x007fd8f21bff58 @male=true>] 

Эти две IRB линии я пытаюсь unsucessfully вспомнить содержание @team

irb(main):007:0> team 
=> #<Team:0x007fd8f21df858 @team=[#<Player:0x007fd8f21d7b08 @male=false>, #<Player:0x007fd8f21bff58 @male=true>]> 

irb(main):013:0> @team 
=> nil 

Код для обоих классов ниже:

class Player 
    def initialize 
    @male = true 
    end 

    def female_player 
    @male = false 
    end 

    def male_player 
    @male 
    end 
end 


class Team 

    def initialize 
    @team = [] 
    end 

    def add_player player 
    @team << player 
    end 

    def player_count 
    @team.count 
    end 

    def valid_team? 
    player_number_check 
    gender_balance 
    end 

private 
    def player_number_check 
    player_count > 6 && player_count < 11 
    end 

def gender_balance 
    @team.select{|player| player.male == true } 
end 
end 

Моя ссылка GitHub для этого кода есть: https://github.com/elinnet/object-calisthenics-beach-volleyball-edition.git

спасибо.

ответ

0

Класс Team не имеет атрибута для получения переменной экземпляра @team. Таким образом, единственный способ, которым Вы можете извлечь его значение является использование instance_variable_get:

irb(main):029:0> team = Team.new 
=> #<Team:0x007fff4323fd58 @team=[]> 
irb(main):030:0> team.instance_variable_get(:@team) 
=> [] 

Пожалуйста, не используйте instance_variable_get для фактического производства кода, хотя; это запах кода. Но для целей проверки переменных экземпляра в IRB все в порядке.

Вы бы обычно определить его с помощью либо attr_accessor :team (чтение/запись) или attr_reader :team (только для чтения) внутри определения класса.