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
相关产品推荐
相关产品推荐

