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

011*_*112 3 ruby arrays

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

[1, 2, 3, 4].push(self[0])
Run Code Online (Sandbox Code Playgroud)

显然,这种使用self是错误的,因为它self指的是主要对象.所以,我的问题:

当我调用时.push,在其参数中如何引用正在调用的数组push?

小智 6

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

[1, 2, 3, 4].instance_eval { self.push(self[0]) }
# => [1, 2, 3, 4, 1]
Run Code Online (Sandbox Code Playgroud)


Tom*_*ord 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]) }
Run Code Online (Sandbox Code Playgroud)