我有一堂课
class MyArray < Array; end
我想定义一个方法,该方法将更改MyArray
的实例,例如:
arr = MyArray.new([1,2,3,4]) # => [1, 2, 3, 4]
arr.inc # => [2, 3, 4, 5]`
可以做到吗?怎么这样?
我尝试过:
class MyArray < Array
def inc
self.each { |i| i = i + 1 }
end
end
答案 0 :(得分:2)
如果希望self
就地改变MyArray实例,则可以使用常规下标语法将修改后的元素写回到#inc
:
class MyArray
def inc
self.each_with_index { |el, idx| self[idx] = el + 1 }
self
end
end
如果要返回MyArray
的新实例,则应使用#map
,它返回常规的Array
,因此请将其包装在类的构造函数中:
class MyArray
def inc
self.class.new(self.map { |i| i + 1 })
end
end
答案 1 :(得分:1)
class MyArray < Array
def inc
each_index{|i| self[i] += 1}
end
end
arr = MyArray.new([1, 2, 3, 4])
arr.inc # => [2, 3, 4, 5]
或
class MyArray < Array
def inc
replace(map(&:succ))
end
end
arr = MyArray.new([1, 2, 3, 4])
arr.inc # => [2, 3, 4, 5]