Ruby运行报undefined method `call' for nil:NilClass错误求解
报错原因
报错本质是方法调用写法存在逻辑问题,代码执行流程分为两步:
- 第一步执行
test(:tester):你传入的参数是符号:tester,Ruby中除了nil和false外所有值均为真值,因此命中if分支打印yes。注意Ruby方法默认返回最后一条执行语句的返回值,这里if分支最后执行的是puts "yes",而puts方法的固定返回值是nil。 - 第二步你在
test(:tester)的返回值后追加了.("hello world"),这个语法是Ruby中调用call方法的简写,等价于test(:tester).call("hello world")。但第一步拿到的返回值是nil,nil属于NilClass类,该类没有定义call实例方法,因此抛出你看到的NoMethodError。
修正方式
如果只是想正常调用test方法,删掉调用语句后面多余的.("hello world")即可,直接写:
test(:tester)
如果你本意是让test方法返回一个可调用的Proc/Lambda对象,需要修改方法逻辑,让分支最终返回支持call调用的对象,示例:
def test(tester) if tester puts "yes" ->(msg) { puts msg } # 返回Lambda对象,支持call调用 else puts "error" end end # 此时调用不会报错 test(:tester).("hello world")
运行上述修正后的代码会依次输出:
yes hello world
内容的提问来源于stack exchange,提问作者marcosvaldez81
相关产品推荐
相关产品推荐

