arrays - 修改继承自`Array`的类的接收者
问题描述
我有一堂课:
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
解决方案
self
如果要#inc
就地改变 MyArray 实例,可以使用常规下标语法将修改后的元素写回:
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
推荐阅读
- mysql - 约束 Foregin Key 允许为空?
- postgresql - 如何关闭旧 Cloud Run 修订版的 SQL 连接?
- python - 通过 pip 安装 Snowflake-SQLAlchemy 时构建 pyarrow 失败
- ios - 为什么滚动后自定义 UICollectionViewCell 的出口为零?
- asp.net-web-api - .net 核心模型状态即使在必填字段为空时也有效
- .net - Azure SearchResult 内容大小限制?
- java - 从 yml 配置获取值到依赖项
- ios - 视图控制器出现后 UINavigationBarAppearance 更新
- android - 在运行时更改 7.0 以上设备的语言问题
- c# - 将 docker 环境变量传递给 .net 核心