我是 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 * a
是 z.send(:*, a)
意思是在 z
上调用 *
方法对象,并将 a
作为参数传递。
所以...如果您查看文档:
https://ruby-doc.org/core-3.0.2/String.html#method-i-2A
string 的 *
方法需要 int 作为它的参数,并且
https://ruby-doc.org/core-2.5.0/Integer.html#method-i-2A
int 的 *
期望将数字(int 或 float)作为参数传递。
或者,换句话说,*(和 +、- 等)不是 Ruby 中的运算符(就像它们是 C 或其他语言中的运算符一样),而只是所谓的语法糖,可以让您的生活更轻松,但实际上是对象上的方法。
关于ruby-on-rails - 为什么我尝试在 ruby 中打印 [string * Integer] 时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68990876/