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

时间:2017-02-16 08:24:16

标签: ruby

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

1 个答案:

答案 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