Ruby NoMethodError未定义方法 ''...' for '....:Class'

问题描述

@H_404_0@require_relative 'json_lookup' require_relative 'csv_lookup' require_relative 'error' BASE_RATE = 'EUR' class CurrencyExchange def initialize(file:,date:,from:,to:) @file = file @date = date @from = from @to = to end def rate lookup = find_lookup lookup.to_currency / lookup.from_currency end private def find_lookup case File.extname(@file) when ".json" JsonLookup.new(@file,@date,@from,@to) when ".csv" CsvLookup.new(@file,@to) else raise FileError end end end

当我在 irb 中运行 CurrencyExchange.rate 时,我不断收到此错误,所以我猜测 rate 方法出了问题,但无法弄清楚原因。但我可能遗漏了一些非常明显的东西......因为我是 Ruby 的完全初学者,希望得到任何帮助 :)

回溯如下..

@H_404_0@irb(main):003:0> CurrencyExchange.rate(Date.new(2018,11,22),"USD","GBP") Traceback (most recent call last): 5: from C:/Ruby26-x64/bin/irb.cmd:31:in `<main>' 4: from C:/Ruby26-x64/bin/irb.cmd:31:in `load' 3: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>' 2: from (irb):3 1: from (irb):3:in `rescue in irb_binding' NoMethodError (undefined method `rate' for CurrencyExchange:Class)

解决方法

rate 是示例中的实例方法,但 CurrencyExchange.rate 尝试调用类方法。

要解决此问题,请先初始化一个实例,然后在该实例上调用 rate。此外 rate 不接受参数,您需要将变量传递给初始化方法。

currency_exchange = CurrencyExchange.new(
  file: file,date: Date.new(2018,11,22),from: "USD",to: "GBP"
)
currency_exchange.rate

注意初始化器需要 4 个命名参数。您还需要将文件传递给 new 方法。