运行 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
顶部完全运行的结果中的“数字”个数。
这里发生了什么<<
,有人可以给我一些演练吗?