You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:19:26