这是关于我应该做什么的说明。
在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
请原谅我的非程序员说法,但这就是我以为我在做的事情:
然后我输入:["hi", "hello", "goodbye"].next_in_line()
以下是我尝试时收到的错误消息:
NoMethodError: undefined method 'push' for "hi":String
为什么我的代码不起作用?
答案 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