使用本机方法替换详细代码块(Ruby on Rails)

时间:2014-08-29 13:06:29

标签: ruby-on-rails ruby

我一直在尝试使用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

这是我想要的一个非常基本的例子,虽然这是我发现自己使用了几次的模式。有没有办法内置这个?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Array类的Ruby文档将是一个很好的起点。在那里,您将找到构造和操作数组的不同方法。

例如,构造一个包含3个单空格字符串的数组:

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

然后,您可以使用+来连接像Array.new(3, " ") + numbers这样的数组。

Array类包含EnumerationRange也包含inject。从其他东西构造数组时,(1..3).inject(numbers) { |numbers, i| numbers.unshift(" ") }可能很有用。

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

这样的东西

或者{{1}}