2013-05-30 3 views
3

Запуск метода fizzbuzz1 дает список из 100 членов с номерами от 1 до 100, где каждый кратный 3 заменяется на «fizz», каждый из которых равен 5 «buzz», и каждый кратна как 3 и 5 по «FizzBuzz»:Ruby Strings - разность между << и + =

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 вверху.

Что здесь происходит с <<, может кто-нибудь дать мне небольшое пошаговое руководство?

ответ

6

Есть два взаимодействующих вопросы здесь:

  1. Форма Array.new() и
  2. Стиль конкатенации.

В форме, которую вы используете, Array.new(100, "") создает массив с 100 элементами, каждый из которых указывает на ту же пустую строку. += возвращает новую строку, так что это не имеет значения. << присоединяется к существующей строке, поэтому имеет значение, что они все одинаковые.

При инициализации result с этой формой Array.new():

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

затем будет работать, как и следовало ожидать, потому что у вас есть 100 различных пустых строк.

+0

ничего себе, кто бы знал. – akonsu

+0

удивительный. Спасибо. – polpetti

+0

не получил разницы между 'Array.new (100," ")' и 'Array.new (100) {" "}'? не могли бы вы больше помочь? –

Смежные вопросы