ruby - 为什么我会得到一个额外的尾随空格以及如何摆脱它?
问题描述
我是 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 $
如您所见,有一条额外的线,我不明白为什么。
解决方案
来自以下文档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
ing 它。然后,您可以依赖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
推荐阅读
- html - 为什么我的子 div 没有从父 div 继承其宽度?
- arrays - 使用 getchar() 将一些间隔整数转换为 C 中的数组的最佳方法是什么?给定最大元素数 = 5
- powershell - Powershell - 将数据字段中有逗号的 2 个 CSV 合并在一起,将其中一个数据逗号解析为分隔符
- amazon-web-services - AWS QuickSight 上 Table Visual 上的滞后函数
- python - 如何在 Python 中使用可能是数学总和中的字符串的变量?
- testing - 通过 bats 测试创建特定目录及其内容
- python - 从日志文件中删除超过 10 天的所有行
- python - 预测值的长度不等于实际值。keras TPU
- sql - SQL Server 2012 中的文本到列
- python - 仅选择包含特定字符的列