2014-08-29 47 views
0

我一直在試圖學習Rails包含的方法,並且遇到了應該有更好/更乾淨的方法完成相同任務的情況,但我不知道如何改進。使用本機方法替換詳細的代碼塊(Ruby on Rails)

我最近碰到的那個如下,我有一個散列數組作爲參數傳入。如果數組少於5個元素,那麼我初始化元素,直到總共有5個元素。

def do_stuff(numbers) 
    raise "Maximum of 5 numbers can be defined in numbers array." if numbers.count > 5 
    blank_range = (numbers.count-1)..5 
    if blank_range.count > 0 
    blank_range.each do |i| 
     numbers[i] = {"entry" = " "} 
    end 
    end 
end 

這是我想要的一個非常基本的例子,雖然它是我發現自己使用了幾次的模式。有沒有內置的方法?

回答

1

我想方法#fill是你所需要的。它有三個參數 - 一個要附加到數組的對象和一個用來填充該對象的範圍。

numbers.fill({ 'entry' => ' ' }, numbers.size...5) 

所以{ 'entry' => '' }是你的對象,numbers.size是一個起始位置,5是結束位置。

如果numbers.size是5,則不填充任何內容。

http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-fill

+0

完美。謝謝=] – bdx 2014-08-30 00:44:53

0

的Ruby文檔的Array類將是一個偉大的地方開始。你會發現不同的方式來構建和操作數組。

例如,構建的3個單空間字符串的數組:

[" "] * 3   => [" ", " ", " "] 
Array.new(3, " ") => [" ", " ", " "] 

你可以然後使用+來串聯陣列等Array.new(3, " ") + numbers

Array類包括Enumeration,與Range一樣。當從別的東西構建一個數組時,inject可能很有用。

喜歡的東西(1..3).inject(numbers) { |numbers, i| numbers.unshift(" ") }

或許3.times { numbers.unshift(" ") }