我正在尝试为我创建的对象创建一个方法。在这种情况下,它是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
提前致谢!
答案 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]