首页 > 解决方案 > 为什么我会得到一个额外的尾随空格以及如何摆脱它?

问题描述

我是 ruby​​ 的新手,我不明白为什么我在运行这段代码后会得到一个额外的空行作为输出的一部分。我正在使用 Ruby 2.5.3

class Card
  attr_accessor :rank, :suit

  def initialize(rank,suit)
    @rank = rank
    @suit = suit
  end

  def output_card
    puts "#{self.rank} of #{self.suit}"
  end

  def self.random_card
    suit = ["hearts", "spades", "clubs", "diamonds"]
    Card.new(rand(1..13), suit.sample)
  end
end

class Deck
  def initialize
    d = 0
    @cards =[]
    while d < 13
      @cards << Card.random_card
      d += 1
    end
  end

  def shuffle
    @cards.shuffle!
  end

  def output
    @cards.each do |card|
      card.output_card
    end
  end

  def deal
    self.shuffle
    dealing = @cards.shift
    puts "#{dealing.output_card}"
  end
end

deck = Deck.new
deck.deal

以上将给我这个结果:

[ENV]:/vagrant/OOP $ ruby card.rb
6 of clubs

[ENV]:/vagrant/OOP $

如您所见,有一条额外的线,我不明白为什么。

标签: rubyoopclass-level

解决方案


来自以下文档puts

在尚未以换行序列结尾的任何内容之后写入换行符。

Deck.deal你有puts "#{dealing.output_card}". Card#output_card定义为:

def output_card
  puts "#{self.rank} of #{self.suit}"
end

即,Card#output_card已经在最后打印了一个新行。此方法的返回值,即 的返回值puts,而文档中的返回值是nil,然后打印在 中Deck.deal,从而导致打印一个空行。

简而言之,您打印了两次,其中第二次puts导致附加行。

我建议你删除putsCard因为它不应该有打印本身的概念。这就是 的工作Deck。我会更改Card#output_cardCard#to_s并且只返回您正在构建的字符串而不是putsing 它。然后,您可以依赖puts将调用#to_s正在打印的对象的事实。

class Card
  # ...

  def to_s
    "#{self.rank} of #{self.suit}"
  end

  # ...
end

class Deck
  # ...

  def output
    @cards.each do |card|
      puts card
    end
  end

  def deal
    self.shuffle
    puts @cards.shift
  end
end

推荐阅读