ruby-on-rails - 为什么我尝试在 ruby​​ 中打印 [string * Integer] 时出错?

标签 ruby-on-rails ruby

我是 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) 意味着您在 上调用 * 方法a 并传递 z 作为参数,

z * az.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/

相关文章:

ruby-on-rails - 渲染 :action and render :template 之间的差异

ruby - 导轨 : Multiple options into a single string

ruby - 如何将日期转换为具有特定时区的 ActiveSupport::TimeWithZone?

ruby - Nanoc3 站点创建估计

ruby - 提取祖先到 "me"

ruby-on-rails - 列出与当前 activerecord 对象无关的数据

ruby-on-rails - 计算多个数组之间的可能组合

javascript - Rails 无法从 link_to 加载 Chrome 中的 js

ruby-on-rails - 无法运行 rails 命令。你的 Ruby 版本是 2.2.1,但是你的 Gemfile 指定了 2.1.4

ruby - 在 Ohm/Redis 中设置动态字段