为什么当我尝试在 ruby​​ 中打印 [string * Intger] 时出现错误?

我是 ruby​​ 语言的初学者,所以我尝试打印这一行

   a = 2  
   z = "A"
   print a * z  

然后我得到这个错误

Traceback (most recent call last):
    20: from /usr/local/bin/irb:23:in `<main>'
    19: from /usr/local/bin/irb:23:in `load'
    18: from /var/lib/gems/2.7.0/gems/irb-1.3.7/exe/irb:11:in `<top (required)>'
     1: from (irb):24:in `<main>'
(irb):24:in `*': String can't be coerced into Integer (TypeError)

但是当我尝试使用此代码时,它以正确的方式工作并且我没有收到任何错误

puts z * 2

or 

puts "A" * 2 

or 
 
z*a     
HERE I DON'T USE PRINT, PUTS, P

那么为什么我在开始的例子中得到错误,以及两个代码的作用机制是什么

回答

简短的回答:顺序很重要。

a * z基本上相当于a.send(:*, z)你调用一个*方法az作为它的参数传递,

z * az.send(:*, a)*z对象上调用方法,并a作为参数传递。

所以......如果你检查文档:https :
//ruby-doc.org/core-3.0.2/String.html#method-i-2A
字符串的*方法需要 int 作为它的参数,并且

https://ruby-doc.org/core-2.5.0/Integer.html#method-i-2A
int*期望将数字(int 或 float)作为参数传递。

或者,换句话说,*(和 +、- 等)不是 Ruby 中的运算符(就像它们是 C 或其他语言中的运算符),而是所谓的语法糖,使您的生活更轻松,但在对象上的事实方法。


以上是为什么当我尝试在 ruby​​ 中打印 [string * Intger] 时出现错误?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>