我的Ruby程序打印对象的检查而不是定义的to_s方法

Imm*_*mid -2 ruby

最后,当我尝试在我的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但我无法使用它,因为它显示的是地址,而不是我传递的内容.请提前感谢,请让我知道我做错了什么.

Ess*_*sse 5

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)