最后,当我尝试在我的ruby程序中添加splat并打印red_team时没有显示我传递的内容,但它显示了地址.
只需在终端上运行这段代码,您就会知道我在说什么.它告诉我这个
Power Rangers team: `#<Context::Player:0x0000000252c3d8>, #<Context::Player:0x0000000252c298>, #<Context::Player:0x0000000252c158>, #<Context::Player:0x0000000252c018>, #<Context::Player:0x0000000252bed8>`
Run Code Online (Sandbox Code Playgroud)
我的代码:
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
Run Code Online (Sandbox Code Playgroud)
此外,我已经包含了Enumerable,它是ruby中的内置方法,最后使用select和reject但我无法使用它,因为它显示的是地址,而不是我传递的内容.请提前感谢,请让我知道我做错了什么.
to_s在Player类中提供方法时,实际上是在屏幕上打印而不是返回.
将课程中的to_s方法更改Player为:
def to_s
"<#{@name}: #{@skill_level}(SL), #{@age}(AGE)"
end
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的:
puts "a"
a
#=> nil
Run Code Online (Sandbox Code Playgroud)
putsmethod在控制台中打印输出并返回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
Run Code Online (Sandbox Code Playgroud)