Ruby字符串 - <<<<<<和+ =

时间:2013-05-30 19:21:40

标签: ruby string append add fizzbuzz

运行方法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.

但是,为+=切换每个<<会产生意外情况:

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顶部的结果中的“数字”数。

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

1 个答案:

答案 0 :(得分:6)

这里有两个相互作用的事项:

  1. Array.new()
  2. 的形式
  3. 字符串连接的样式。
  4. 在您使用的表单中,Array.new(100, "")创建一个包含100个元素的数组,每个元素指向相同的空字符串。 +=返回一个新字符串,因此无关紧要。 <{1}}附加到现有字符串,因此它们都是相同的。

    如果您使用<<

    这种形式初始化result
    Array.new()

    然后result = Array.new(100){""} 将按预期工作,因为您有100个不同的空字符串。