使用 IRB 访问实例变量数组
Accessing instance variable array using IRB
我是 Ruby 的新手,我正在进行一项运动,运动队(最多 10 人)必须至少有 2 名男性和 2 名女性。我创建了一个玩家 class,其中确定了玩家的性别,并创建了一个团队 class,我将这些玩家添加到 @team 的实例变量数组(在团队初始化时创建)。
我已将我的完整代码放在此请求的底部。
我希望有人能在以下方面帮助我:
(1) 我在 IRB 中输入什么才能具体 recall/maniuplate @team 实例变量数组(存储所有玩家)。我希望稍后遍历数组或提取数组中的第一项(@team.first 不起作用)
(2) 我很难编写代码来确定@team 实例变量中是否至少有 2 名男性和女性玩家。我在团队 class 中提出的最佳代码如下 - 但它报告说 @team 为 nilclass.
def gender_balance
@team.select{|player| player.male == true }
end
我研究了互联网并尝试了各种组合来寻找答案 - 但没有成功。
下面是我输入的 IRB 命令,用于创建和添加球员到球队。下面是我的团队代码(其中包含评估它是否具有正确的性别组合的方法)和玩家。
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 是我试图回忆@team
的内容,但没有成功
irb(main):007:0> team
=> #<Team:0x007fd8f21df858 @team=[#<Player:0x007fd8f21d7b08 @male=false>, #<Player:0x007fd8f21bff58 @male=true>]>
irb(main):013:0> @team
=> nil
两个 classes 的代码如下:
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
谢谢。
你的 Team
class 没有获取 @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
(read/write)或 attr_reader :team
(只读)在 class定义。
我是 Ruby 的新手,我正在进行一项运动,运动队(最多 10 人)必须至少有 2 名男性和 2 名女性。我创建了一个玩家 class,其中确定了玩家的性别,并创建了一个团队 class,我将这些玩家添加到 @team 的实例变量数组(在团队初始化时创建)。
我已将我的完整代码放在此请求的底部。
我希望有人能在以下方面帮助我:
(1) 我在 IRB 中输入什么才能具体 recall/maniuplate @team 实例变量数组(存储所有玩家)。我希望稍后遍历数组或提取数组中的第一项(@team.first 不起作用)
(2) 我很难编写代码来确定@team 实例变量中是否至少有 2 名男性和女性玩家。我在团队 class 中提出的最佳代码如下 - 但它报告说 @team 为 nilclass.
def gender_balance
@team.select{|player| player.male == true }
end
我研究了互联网并尝试了各种组合来寻找答案 - 但没有成功。
下面是我输入的 IRB 命令,用于创建和添加球员到球队。下面是我的团队代码(其中包含评估它是否具有正确的性别组合的方法)和玩家。
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 是我试图回忆@team
的内容,但没有成功irb(main):007:0> team
=> #<Team:0x007fd8f21df858 @team=[#<Player:0x007fd8f21d7b08 @male=false>, #<Player:0x007fd8f21bff58 @male=true>]>
irb(main):013:0> @team
=> nil
两个 classes 的代码如下:
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
谢谢。
你的 Team
class 没有获取 @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
(read/write)或 attr_reader :team
(只读)在 class定义。