2012-01-06 2 views
0

Фрагмент моего кода ниже переворачивает монету и выводит результат из 10 общих головок или хвостов.Сохранение вывода в переменной, которая будет использоваться в массиве

(например, руководители Хвосты Хвосты Heads ...)

Я хотел бы сохранить это в переменную, где я могу поставить его в массив и использовать его строки.

% w [act] выводит только строку «act». Как я могу получить эту строку кода для вывода моего массива строк из строки act = coin.flip?

Обновлены и добавлены полный код

class Coin 

    def flip 
    flip = 1 + rand(2) 
     if flip == 2 
     then puts "Heads" 
     else 
     puts "Tails" 
     end 
    end 

end 

array = [] 

10.times do 
    coin = Coin.new 
    array << coin.flip 
end 

puts array 

ответ

2

Это:

10.times do 
    coin = Coin.new 
    act = coin.flip 
end 

не производит массив. Он просто создает десять монетных флип и бросает их всех, результат этого выражения, по сути, 10. Если вам нужен массив, вам нужно его построить.

Вы можете воспользоваться подходом Дугласа или попробовать что-то более идиоматическое.

Метод Integer#times возвращает перечислитель, поэтому вы можете использовать любой из методов Enumerable, а не напрямую передавать ему блок. В частности, можно использовать collect, чтобы создать массив в одном хороший короткий кусок кода:

a = 10.times.collect { Coin.new.flip } 

Это дает вам 10 переворачивается в массиве a, а затем вы можете puts a или puts a.join(', ') или что вы хотите.

%w[] не будет работать, потому что это для генерации Array of whitespace separated words:

%w[] Non-интерполированное массив слов, разделенных пробелами

Так %w[a b c] это просто красивый способ сказать ['a', 'b', 'c'] а слова в пределах %w[] рассматриваются как строки с одиночными кавычками, а не переменные или вызовы методов, подлежащие оценке.


Похоже, что происходит некоторое редактирование. Вы также хотите изменить метод flipдля возвращения оборотная, а не печатать его:

def flip 
    flip = 1 + rand(2) 
    if flip == 2 
    "Heads" 
    else 
    "Tails" 
    end 
end 

Тогда вы получите ваши головы и Rails в массиве.

+0

Абсолютно спот на ответ. Я узнал больше, чем просто найти решение. Очень признателен! – Tony

+0

@Tony: Вы можете заменить реализацию 'flip' просто« rand (2) .even ?? «Головы»: «Хвосты» (или другие подобные вещи). И вам также не нужно создавать новую монету каждый раз, нет состояния, чтобы вы могли 'c = Coin.new; a = 10 × collect {c.flip} '. –

+0

Удивительный. Rand (2) .even ?? «Головы»: «Хвосты» значительно сокращают код и действительно работают. – Tony

1

Поместите act результаты в массив.

arr = [] 

10.times do 
    coin = Coin.new 
    arr << coin.flip 
end 

p arr # => [...] 
+0

Отличная помощь! Но по какой-то причине кладет массивы на 10 пустых строк после десяти строк Heads и Tails. Я не думаю, что coin.flip помещается в массив. – Tony

+0

'10.times.map {Coin.new.flip}' более аккуратный. – Fraser

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