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

Ruby类private attr_accessor未按预期工作,调用str.downcase报nil无方法错误

错误根因

你在format方法第一行写的str = str.downcase触发了Ruby的局部变量优先级规则:当Ruby解析到代码中存在给str赋值的逻辑时,会直接将str识别为当前方法的局部变量,赋值操作右侧的str还没有完成初始化,值为nil,因此调用downcase方法抛出异常。你的本意是调用attr_accessor定义的str getter方法读取实例变量,但是变量名冲突导致没有触发方法调用。

修复方案

最简单的改法是直接读取实例变量@str,无需调用getter,修改后完整代码如下:

class NonAccentVietnamese
  def initialize(str)
    @str = str
  end

  def format
    # 直接读取实例变量避免局部变量冲突
    str = @str.downcase
    str = str.gsub(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/, "a")
    str = str.gsub(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/, "e")
    str = str.gsub(/ì|í|ị|ỉ|ĩ/, "i")
    str = str.gsub(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/, "o")
    str = str.gsub(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/, "u")
    str = str.gsub(/ỳ|ý|ỵ|ỷ|ỹ/, "y")
    str = str.gsub(/đ/, "d")
    # 处理部分系统中作为单独UTF-8字符存储的越南语组合重音
    str = str.gsub(/\u0300|\u0301|\u0303|\u0309|\u0323/, "") # 玄、锐、问、跌、重声调
    str = str.gsub(/\u02C6|\u0306|\u031B/, "") # Â、Ê、Ă、Ơ、Ư对应的组合字符
    str
  end

  private

  attr_accessor :str
end

修改后调用测试即可正常返回结果:

[2] pry(main)> NonAccentVietnamese.new("Ruby on Rails").format
=> "ruby on rails"

如果你要保留调用getter的写法,需要将attr_accessor :str移到类的公有作用域(private关键字上方),再将第一行改为str = self.str.downcase即可。


内容的提问来源于stack exchange,提问作者Karamm_113

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:07