Ruby中使用is_a?检查类型触发TypeError的问题排查
为什么调用
is_a?检查字符串类型时触发了TypeError? 嘿,这个问题的根源其实很清晰——is_a?方法要求传入的参数必须是类或者模块对象,而不是字符串字面量。
看你贴的irb执行记录:
p server[0]['role'].is_a? 'String'
这里你传的是带引号的'String'(字符串),但Ruby的is_a?需要的是String这个类本身(注意没有引号,它是一个Class对象)。当你传入字符串时,Ruby没法把它识别成合法的类/模块,自然就抛出TypeError: class or module required的错误了。
正确的写法应该是这样:
# 直接传入 String 类对象 p server[0]['role'].is_a? String # 或者用它的别名 kind_of?,效果完全一样 p server[0]['role'].kind_of? String
这样就能得到你预期的布尔值true,完全符合文档里描述的is_a?(class) → true or false的行为。
额外小技巧:
如果因为业务场景限制,你只能拿到类名的字符串形式,也可以通过Object.const_get把字符串转成对应的类对象,再传给is_a?:
class_name = 'String' p server[0]['role'].is_a? Object.const_get(class_name)
不过如果不是动态获取类名的需求,直接传入类对象是更简洁高效的做法哦。
内容的提问来源于stack exchange,提问作者Wings
相关产品推荐
相关产品推荐

