为什么Ruby中打印整数乘字符串报错,调换操作数顺序却正常?
报错原因
Ruby 中所有运算符本质都是对象的实例方法,* 也不例外。x * y 的执行逻辑等价于调用 x 的 * 实例方法,将 y 作为参数传入,也就是 x.*(y)。
你最初写的 a * z 中,a 是 Integer 类型的数值 2,调用的是 Integer 类的 * 方法:
- Integer 的
*方法仅支持接收数值类型的参数做乘法运算,你传入的 z 是字符串类型,Integer 无法将字符串强制转为整数参与计算,因此抛出String can't be coerced into Integer (TypeError)类型错误。
调换操作数后正常运行的原理
当你写成 z * a 时,调用方变成了 String 类型的 z,此时执行的是 String 类的 * 方法:
- String 类原生实现了接收整数参数的
*方法,作用是将当前字符串重复参数指定的次数,返回新的字符串,比如"A" * 2会返回"AA",完全符合方法的参数要求,因此不会报错。
你提到的z*a没有调用 print/puts 也能运行的情况,是因为 Ruby 执行时只要表达式本身语法和逻辑合法,就会正常执行计算,只是不主动将结果打印到控制台而已,不存在运行错误。
内容的提问来源于stack exchange,提问作者joox
相关产品推荐
相关产品推荐

