Ruby不使用to_i转字符串为整数,匿名类self('9')失效的解决办法
问题分析与解决方案
首先得明确你代码里的核心问题:你在单例类(class << self块)里写的self(value),这里的self指向的是实例的单例类对象,而不是Integer类本身。单例类是只为单个实例添加专属方法的特殊类,它没有继承Integer的类型转换构造逻辑,自然没法像Integer('9')那样处理字符串转整数的操作。
下面给你两个可行的解决方案,都不需要用到to_i方法:
方案1:修正单例类中的调用逻辑
既然单例类的父类就是Integer,我们可以直接调用父类的构造能力来实现转换。调整后的代码如下:
let!(:s_integer) do # 先创建一个基础的Integer实例 int = Integer(0) # 打开这个实例的单例类 class << int def change(value) self.superclass(value) # 调用Integer类的类型转换逻辑 end end # 给实例添加change方法 def int.change(value) self.class.change(value) end int end
现在调用s_integer.change('9')就会返回9,和Integer('9')的效果完全一致。
方案2:改用定义Integer子类的方式(更清晰)
如果你的需求是创建一个具备change方法的整数类型对象,直接定义Integer的子类会更直观,也能避免单例类带来的混淆:
let!(:s_integer) do # 定义Integer的子类 CustomInteger = Class.new(Integer) do def self.change(value) self(value) # 这里的self是CustomInteger类,支持和Integer一样的类型转换 end def change(value) self.class.change(value) end end # 创建子类的实例 CustomInteger.new(0) end
这个方案里,CustomInteger('9')和s_integer.change('9')都会返回CustomInteger类型的9,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Thermatix
相关产品推荐
相关产品推荐

