打印信用卡表的方法

时间:2017-07-04 22:18:16

标签: ruby methods

有人可以向我解释这种方法是如何工作的,我知道它打印一张桌子并且效果很好但是我不明白它是如何工作的:( 救命!

class CreditCard
  attr_reader :name, :number, :expiration, :cvc
  attr_accessor :status

    def initialize(name,number,expiration,cvc,status)
      @name = name 
      @number = number
      @expiration = expiration
      @cvc = cvc
      @status = status
    end

    def information
      card_information = "#{@name}", "#{@number}", "#{@expiration}", "#{@cvc}", "#{@status}"  
    end  

end

card_array = []
credit_card.each do |x|
  card_array << x.information
end  

这种方法!!!

print "Name".center(20)," Number".center(25)," Expiration".center(20)," Cvc".center(22)," Status".center(25),"\n"
puts "___________________________________________________________________________________________________________________"
card_array.each do |x|
  x.each do |card|
    print "|",card.center(20),"|"
  end
   print "\n"
end
print "\n"

1 个答案:

答案 0 :(得分:0)

不确定哪个部分特别令人困惑,所以如果这是一个小小的居高临下的道歉。让我们逐行逐步完成:

print "Name".center(20)," Number".center(25)," Expiration".center(20)," Cvc".center(22)," Status".center(25),"\n"

这第一行调用print传递一个可变数量的字符串参数,一个接一个地打印出来。这些字符串参数都是center作为列标题。输出所有标题后,将在输出中的新行开始打印换行符。

puts "___________________________________________________________________________________________________________________"

此行仅用于格式化,在表头和内容之间输出分隔符。由于他们使用puts而不是在此处打印,因此会在字符串后自动输出新行。

card_array.each do |x|
...
end

此块是针对每个构造的,因此对于card_array中的每个信用卡,我们将卡分配给局部变量x,然后执行此块内的代码。

 x.each do |card|
 ...
 end

同样,这是一个foreach结构,其中x是信用卡作为字符串数组(请参阅information方法)。我们将每个字符串一次分配给card,然后在其中执行该块。

print "|",card.center(20),"|"

这是另一个打印调用,我们使用可变长度参数传递3个参数,card中的当前字符串以及我假设为表格单元格边框。

print "\n"

然后我们再打两个电话打印,在每个块的末尾打印出新行,这样每张信用卡都在它自己的行上。

在解释了相关的块之后,我觉得这段代码的混淆可能来自于information方法,其中,可能不会立即显而易见

card_information = "#{@name}", "#{@number}", "#{@expiration}", "#{@cvc}", "#{@status}"

实际上正在创建一个字符串数组,然后将其添加到card_array中,因此card_array是一个数组数组,最终看起来像

[ ["card holder name", "card number", ...], ["second card hold name", "second card number", ...], ...]

我花了二读才发现他们正在这样做,所以想象一下这可能是被忽略的东西,使得有问题的块不清楚(如果你认为它是一组CreditCard对象而不是一串字符串。)