如何获取对方法中调用的对象的引用?

时间:2017-07-24 22:49:42

标签: ruby class

我正在尝试为我创建的对象创建一个方法。在这种情况下,它是Array类的扩展。以下方法my_uniq有效。当我致电puts [1, 1, 2, 6, 8, 8, 9].my_uniq.to_s时,它会输出到[1, 2, 6, 8]

以类似的方式,在median中,我试图获取对象本身的引用,然后操纵该数据。到目前为止,我只能考虑使用map函数将变量arr指定为数组来处理来自的数据。

您是否可以调用任何方法来获取对您尝试操作的内容的引用?示例伪代码我可以使用以下内容替换arr = map {|n| n}:{{ 1}}。

arr = self

提前致谢!

2 个答案:

答案 0 :(得分:2)

dup

class Array
  def new_self
    dup
  end

  def plus_one
    arr = dup
    arr.map! { |i| i + 1 }
  end

  def plus_one!
    arr = self
    arr.map! { |i| i + 1 }
  end
end

array = [1, 3, 5]
array.new_self # => [1, 3, 5]
array.plus_one # => [2, 4, 6]
array # => [1, 3, 5]
array.plus_one! # => [2, 4, 6]
array # => [2, 4, 6]

dup制作对象的副本,如果您需要在不改变原始对象的情况下操作数据,则可以使其成为更安全的选择。您可以使用self,即arr = self,但您执行的更改arr也会更改self的值。使用dup

是个好主意

如果您确实想要操作和更改原始对象,则可以使用self代替dup,但您应该将其设为“爆炸”!方法。如果它改变了接收对象,那么在方法名称的末尾放一个爆炸!就是红宝石的惯例。如果其他开发人员可能使用您的代码,这一点尤为重要如果非爆炸方法改变接收对象,大多数Ruby开发人员会非常惊讶。

答案 1 :(得分:1)

class Array
  def median
    arr = self
    puts arr.to_s
  end
end

[1,2,3] .median#=> [1,2,3]

相关问题