如何引用数组推送被调用?

时间:2017-12-02 09:51:45

标签: arrays ruby

我试图创建一个数组,其中第一个元素和最后一个元素是相同的。我希望能够这样做,而无需为数组分配名称。请考虑以下代码:

Equatable

显然,[1, 2, 3, 4].push(self[0]) 的使用是错误的,因为self指的是主要对象。所以,我的问题是:

当我调用self时,在其参数中如何引用正在调用的数组推送?

3 个答案:

答案 0 :(得分:6)

好吧,一个选项是使用instance_evalViews引用你正在使用的对象:

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]