最后,当我尝试在我的ruby程序中添加splat并打印red_team时没有显示我传递的内容,但它显示了地址。
只需在终端上运行这段代码,您就会知道我在说什么。它告诉我这个
Power Rangers team: `#<Context::Player:0x0000000252c3d8>, #<Context::Player:0x0000000252c298>, #<Context::Player:0x0000000252c158>, #<Context::Player:0x0000000252c018>, #<Context::Player:0x0000000252bed8>`
我的代码:
class Player
attr_accessor :name, :age, :skill_level
def initialize (name, age, skill_level)
@name = name
@age = age
@skill_level = skill_level
end
def to_s
puts "<#{@name}: #{@skill_level}(SL), #{@age}(AGE)"
end
end
class Team
include Enumerable
attr_accessor :name, :players
def initialize (name)
@name = name
@players = []
end
def add_players (*players)
@players += players
end
def to_s
"#{@name} team: #{@players.join(', ')}"
end
def each
@players.each {|player| yield player}
end
end
player1 = Player.new("Immad", 24, 10)
player2 = Player.new("Sharjeel", 24, 10)
player3 = Player.new("Danish", 24, 10)
player4 = Player.new("Ali", 24, 10)
player5 = Player.new("Nawfil", 24, 10)
red_team = Team.new("Power Rangers")
red_team.add_players(player1, player2, player3, player4, player5)
puts red_team
此外,我已经包含了Enumerable,它是ruby中的内置方法,最后使用select和reject但我无法使用它,因为它显示的是地址而不是我传递的内容。 请事先感谢,请让我知道我做错了什么。
答案 0 :(得分:5)
在Player类中提供to_s
方法时,实际上是在屏幕上打印而不是返回。
将to_s
课程中的Player
方法更改为:
def to_s
"<#{@name}: #{@skill_level}(SL), #{@age}(AGE)"
end
正如你在这里看到的那样:
puts "a"
a
#=> nil
puts
方法在控制台中输出输出并返回nil
。如果to_s
方法返回nil
(或任何非字符串值),则Ruby使用Object#to_s
方法作为后备来提供任何输出。就像在这个最小的例子中一样:
class A
def to_s
nil
end
end
a = A.new
#=> #<A:0x007fbfca06f770>
puts a
#<A:0x007fbfca06f770>
#=> nil