在Array上定义next_in_line方法,该方法将元素放在数组的开头并将其放在最后

时间:2015-07-21 04:36:34

标签: arrays ruby

这是关于我应该做什么的说明。

  

在Array上定义一个next_in_line方法,该方法将元素放在数组的开头并将其放在最后。提示:记住,Array#shift删除第一个元素,Array#push添加一个元素到最后。

我尝试过十几种变体,但似乎没有任何效果。以下是我认为可行的方法:

class Array
  define_method(:next_in_line) do
    new_array = self.shift()
    new_array = new_array.push()
  end
end

请原谅我的非程序员说法,但这就是我以为我在做的事情:

  1. 定义方法的类(数组)。
  2. 定义方法(下一行)
  3. 第三行删除数组的第一个元素
  4. 第四行将删除的元素推送到最后。
  5. 然后我输入:["hi", "hello", "goodbye"].next_in_line()

    以下是我尝试时收到的错误消息:

    NoMethodError: undefined method 'push' for "hi":String
    

    为什么我的代码不起作用?

3 个答案:

答案 0 :(得分:3)

错误是因为:在没有参数的情况下调用时,self.shift返回元素,而不是数组。

要修复错误,请使用:

class Array
  def next_in_line
    return self if empty?
    push shift
  end
end

["hi", "hello", "goodbye"].next_in_line
# => ["hello", "goodbye", "hi"]

请注意,内置Array#rotate

答案 1 :(得分:3)

作为替代解决方案,我会做类似的事情:

class Array
  def next_in_line
    self.rotate(1)
  end

  # If you want to reverse(make Last element as First)
  def prev_in_line
    self.rotate(-1)
  end
end
array = ["hi", "hello", "goodbye"]
> array.next_in_line
#=> ["hello", "goodbye", "hi"]
> array.prev_in_line
#=> ["goodbye", "hi", "hello"]

答案 2 :(得分:1)

这有效:

class Array
  def next_in_line
    push(self.shift())
  end
end

您无需使用define_method来定义此实例方法。 define_method非常适合元编程,但您不需要它。

以下是如何使代码与define_method一起用于您的教育目的:

class Array
  define_method(:next_in_line) do
    push shift
  end
end