2012-01-06 144 views
0

下面我的代碼的片段翻轉硬幣並輸出10個總正面或反面的結果。將輸出存儲到陣列中使用的變量

(例如元首尾巴尾巴首腦...)

我想這個存儲到一個變量,我可以把它變成一個數組,並使用其字符串。

%w [動作]只輸出字符串「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個硬幣翻轉並將它們全部拋出,實際上這個表達式的結果是10.如果你想要一個數組,你需要創建一個。

你可以採取道格拉斯的方法或嘗試一些更習慣的東西。

Integer#times方法返回一個枚舉器,因此您可以使用Enumerable中的任何方法,而不是直接將塊交給它。特別是,你可以使用collect在一個漂亮的一小段代碼來構建一個數組:

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

這使你在Array a 10個翻轉,然後你可以puts aputs a.join(', ')或任何你想要的。

%w[]不會工作,因爲這是用於生成Array of whitespace separated words:單詞

%w[]非插陣列,用空格

所以%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 2012-01-06 01:03:09

+0

@Tony:你可以用'rand(2)替換你的'flip'實現。 '頭':'尾巴'(或各種類似的東西)以及。而且你不需要每次都創建一個新的Coin,沒有狀態,所以你可以'c = Coin.new; a = 10.times.collect {c.flip}'。 – 2012-01-06 01:27:37

+0

太棒了。蘭特(2)。即便?? 「頭部」:「尾巴」將代碼縮短了很多,而且的確很有效。 – Tony 2012-01-06 01:43:33

1

act結果轉換成一個數組。

arr = [] 

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

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

偉大的幫助!但由於某種原因,在十行頭和尾部之後放置陣列輸出10個空行。我不認爲coin.flip正在放入陣列中。 – Tony 2012-01-06 00:44:34

+0

'10.times.map {Coin.new.flip}'更整潔。 – Fraser 2012-06-03 22:01:50