3

运行 fizzbuzz1 方法会生成 100 个成员列表,其中包含 1 到 100 的数字,其中 3 的每个倍数都替换为“fizz”,5 的每个倍数都替换为“buzz”,3 和 5 的每个倍数都替换为“fizzbuzz”:

def fizzbuzz1()
  result = Array.new(100, "")
  result.each_index do |index|
    value = index + 1
    result[index] += "fizz" if value % 3 == 0
    result[index] += "buzz" if value % 5 == 0
    result[index] = "#{value}" if result[index].size == 0
  end
end

2.0.0-p195 :055 > fizzbuzz1
 => ["1", "2", "fizz", "4", "buzz", "fizz", "7", "8", "fizz", ...and so on.

但是,将每个切换+=为 a<<会产生意想不到的结果:

def fizzbuzz2()
  result = Array.new(100, "")
  result.each_index do |index|
    value = index + 1
    result[index] << "fizz" if value % 3 == 0
    result[index] << "buzz" if value % 5 == 0
    result[index] = "#{value}" if result[index].size == 0
  end
end

2.0.0-p195 :057 > entire_fizzbuzz2_result = fizzbuzz2
2.0.0-p195 :058 > entire_fizzbuzz2_result[5]
 => "fizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzz" 

最特别的是,我还注意到,如果我取出这条线:result[index] = "#{value}" if result[index].size == 0给:

def fizzbuzz3()
  result = Array.new(100, "")
  result.each_index do |index|
    value = index + 1
    result[index] << "fizz" if value % 3 == 0
    result[index] << "buzz" if value % 5 == 0
  end
end

2.0.0-p195 :062 > store_fizzbuzz3 = fizzbuzz3
2.0.0-p195 :063 > store_fizzbuzz3.reject { |each| store_fizzbuzz3[0] == each }
 => [] 

这一定意味着 fizzbuzz3 返回一个包含 100 个成员的数组,其中每个元素都相同,并且具有以下特征:

2.0.0-p195 :066 > store_fizzbuzz3[1]
 => "fizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzzfizzfizzbuzzfizzbuzzfizzfizzbuzz" 
2.0.0-p195 :067 > store_fizzbuzz3[1].size
 => 212 
2.0.0-p195 :068 > store_fizzbuzz3[1].size / 4
 => 53 

53 是一个有趣的数字,因为它是 1 到 100 之间的整数个数,不能被 3 或 5 整除……即fizzbuzz1顶部完全运行的结果中的“数字”个数。

这里发生了什么<<,有人可以给我一些演练吗?

4

1 回答 1

6

这里有两个相互作用的问题:

  1. 的形式Array.new(),和
  2. 字符串连接的样式。

在您使用的表单中,Array.new(100, "")创建一个包含 100 个元素的数组,每个元素都指向同一个空字符串。 +=返回一个新字符串,所以没关系。 <<附加到现有字符串,因此它们都相同确实很重要。

如果您result使用以下形式进行初始化Array.new()

result = Array.new(100){""}

然后fizzbuzz2将按预期工作,因为您有 100 个不同的空字符串。

于 2013-05-30T19:39:59.783 回答