我试图创建一个数组,其中第一个元素和最后一个元素是相同的。我希望能够这样做,而无需为数组分配名称。请考虑以下代码:
Equatable
显然,[1, 2, 3, 4].push(self[0])
的使用是错误的,因为self
指的是主要对象。所以,我的问题是:
当我调用self
时,在其参数中如何引用正在调用的数组推送?
答案 0 :(得分:6)
好吧,一个选项是使用instance_eval让Views
引用你正在使用的对象:
self
答案 1 :(得分:6)
执行此操作的一种方法不用更改self
的上下文是使用Object#tap
- 这会将对象生成块,然后返回(新)对象的价值:
[1, 2, 3, 4].tap { |a| a << a[0] }
#=> [1, 2, 3, 4, 1]
# Or equivalently:
[1, 2, 3, 4].tap { |a| a.push(a[0]) }
答案 2 :(得分:2)
另一种替代方案(通常不推荐使用 ,特别是在大型项目中,因为它污染核心类;但在小脚本中可能是一个可行的选择)将是定义方法在Array
类本身:
class Array
def push_first
push(first)
end
end
[1, 2, 3, 4].push_first
#=> [1, 2, 3, 4, 1]