ruby - 为什么我得到 "undefined method ` + @' for "是一个信用 : ":String (NoMethodError)" here?

标签 ruby

我有一些看起来像这样的代码:

bal = sum_account_journal_entries(a)
if bal < 0
  puts a.name +' is a credit: ' + bal.to_s
else
  puts a.name +' is a debit: ' + bal.to_s
end

这里,a 有返回一个 String 的方法 name,而 bal 是一个 Float

当我执行这段代码时(它是 Cucumber step_definition 的一部分,但这不是问题的根源,我们很快就会看到),我得到:

undefined method `+@' for " is a credit: ":String (NoMethodError)

这没有意义。

最佳答案

+@一元+ 运算符,在Ruby 中,它也是一个可以覆盖的方法。例如,

class One
  # Unary +
  def +@
    1
  end

  # Unary -
  def -@
    -1
  end
end

+One.new
=> 1

-One.new
=> -1

在你的情况下,a.name 实际上是一个方法调用(ruby 中没有公共(public)字段。只有公共(public)方法),因此 Ruby 虚拟机 (YARV) 编译 a.name +' 是功劳:' (+ 和字符串之间没有空格)as

  1. 在字符串 ' 上调用 +@' is a credit: '
  2. 使用一个参数调用a 上的方法name:第1 步的结果

然后在运行代码时,它会在第 1 步失败并引发您看到的错误。

另一方面,a.name + ' 是一个 credit: '(+ 和字符串之间至少有一个空格),解释器将其解释为

  1. 不带参数调用a.name
  2. 在步骤 1 的结果上调用 +(二元 + 运算符),带有一个参数 ' is a credit: '

关于ruby - 为什么我得到 "undefined method ` + @' for "是一个信用 : ":String (NoMethodError)" here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586208/

相关文章:

ruby-on-rails - File.open 和 YAML.load_file 显示同一文件的不同内容

ruby-on-rails - 排序多维数组,降序

ruby-on-rails - 从 JSON 字符串中提取 JSON 对象

ruby 中的 Java 流等效?

ruby - 将 Ruby block 中的变量分配给更高的范围

ruby - 如何将 aws 中的 Gem 与 Ruby 结合使用?

ruby - 我们如何验证 Sequel.connect 是否在 Rails 中打开了我们的 SQLite3 数据库?

ruby - ActiveRecord 值是字符串类型数字的列的平均值

ruby - 无法在 OS X 10.6 Snow Leopard 服务器上安装 mysql gem

ruby-on-rails - 项目的页面和 will_paginate