阅读手册!

编程可能很有趣,也可能令人沮丧……尤其是当您在学习新语言时不注意别人给您的提示时。 在最近的LaunchSchool Ruby练习中,我通过艰辛的方式学习了这一课。

该练习涉及在“ n”大小的网格上创建一个8尖的“星形”。 “方格?” 我想,“听起来像是一个完美的时机,第一次使用Ruby语言提取数组!” 我拿起RubyDoc并看了看构造函数方法,浏览直到找到所需的条目。

  Array.new(size = 0,default = nil) 

好完美! 我可以使用此构造函数创建数组,将另一个Array构造函数作为第二个参数传入,以创建数组数组!

 星= Array.new(n,Array.new(n,'') 

在那看一下……现在,我们只需要将其放入函数中,并创建第一条对角星线,以确保一切正常。

  def star(n) 
星= Array.new(n,Array.new(n,''))
stars.each_with_index做
索引
arr [index] ='*'
结束
stars.each {
rr
帕尔}
结束
星(7)

这应该给我们一个很好的对角线,从左上角到右下角……。

  [“ *”,“ *”,“ *”,“ *”,“ *”,“ *”,“ *”] 
[“ *”,“ *”,“ *”,“ *”,“ *”,“ *”,“ *”]
[“ *”,“ *”,“ *”,“ *”,“ *”,“ *”,“ *”]
[“ *”,“ *”,“ *”,“ *”,“ *”,“ *”,“ *”]
[“ *”,“ *”,“ *”,“ *”,“ *”,“ *”,“ *”]
[“ *”,“ *”,“ *”,“ *”,“ *”,“ *”,“ *”]
[“ *”,“ *”,“ *”,“ *”,“ *”,“ *”,“ *”]

等等…什么?!?! 怎么可能 我在每次迭代中只分配了一个值,它们如何全部更改?!?! (注意。每当您假设计算机做错了什么,就可能是您…)

当发生这种疯狂时,最好进入IRB。 让我们再试一次…

  > a1 = Array.new(3,Array.new(3,'')) 
=> [[“”,“”,“”],[“”,“”,“”],[“”,“”,“”]]

好。 到目前为止,到目前为止,我们已经有了一个预期的数组数组。 现在,让我们尝试分配一个值并再次打印…

  > a1 [0] [0] ='*' 
=>“ *”
> p a1
=> [[“ *”,“”,“”],[“ *”,“”,“”],[“ *”,“”,“”]]

等等…再来一次! 怎么可能? 我只分配了一个值,所有三个值都已更新?!?! 哦……等等……

  > a1 [0] .object_id 
=> 70297751770680
> a1 [1] .object_id
=> 70297751770680
> a1 [2] .object_id
=> 70297751770680

实际上,所有三个子数组都引用相同的数组! 通过查看每个单独的数组引用返回的对象ID可以看到这一点。 好吧,这很愚蠢,我的意思是……为什么不在RubyDoc中这么说呢?

糟糕…..事实证明确实如此。 如果我只是花时间仔细阅读它,而不是抢走构造函数并运行它……那本可以节省时间! 让我们再试一次。 这次可以正确地遵循Ruby-doc的说明并使用一个块。

  def star(n) 
stars = Array.new(n){Array.new(n,'')}
stars.each_with_index做
索引
arr [index] ='*'
结束
stars.each {
rr
帕尔}
结束
星(7)

这给了我们期望的漂亮的第一个对角线!

  [“ *”,“”,“”,“”,“”,“”,“”] 
[“”,“ *”,“”,“”,“”,“”,“”]
[“”,“”,“ *”,“”,“”,“”,“”]
[“”,“”,“”,“ *”,“”,“”,“”]
[“”,“”,“”,“”,“ *”,“”,“”]
[“”,“”,“”,“”,“”,“ *”,“”]
[“”,“”,“”,“”,“”,“”,“ *”]

哦,还吸取了另一个教训……现在,我们可以继续实施,并希望获得预期的结果。 通过简单的练习,现在比在更复杂的应用程序中更好!

这里需要更多的耐心和彻底,并注意别人给我们的提示!