Почему я получаю дополнительное конечное место и как от него избавиться? - PullRequest
0 голосов
/ 21 апреля 2019

Я новичок в 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 $

Как видите, есть дополнительная строка, и я не понимаю, почему.

1 Ответ

0 голосов
/ 22 апреля 2019

Из документов 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 приводит к дополнительной строке.

Я предлагаю вам удалить puts из Card, так как он не должен иметь понятия о самой печати. Это работа Deck. Я бы изменил Card#output_card на Card#to_s и просто возвратил строку, которую вы строите, а не puts в ней. Тогда вы можете рассчитывать на то, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...