【问题标题】:How can I call a method when an object is initialized?初始化对象时如何调用方法?
【发布时间】:2016-09-30 04:04:30
【问题描述】:

当我使用ChangeOrderLog.new('path/to/file') 时,如何在我的类中直接调用方法read_spreadsheet 而不是调用cop_log.read_spreadsheet

cop_log.read_spreadsheet 使用 Excel 电子表格中的数据填充 @cop_log 哈希,有什么方法可以从 ChangeOrderLog 类内部而不是外部填充我的哈希?

require 'creek'

class ChangeOrderLog
  attr_reader :creek, :sheet
  attr_accessor :cop_log
  def initialize(file)
    @creek = Creek::Book.new file
    @sheet= @creek.sheets[0]
    @cop_log = {}
  end
  def read_spreadsheet
    sheet.rows.each { |row| cop_log.merge!(row) }
  end
  def job_number
    return cop_log['G1']
  end
end

cop_log = ChangeOrderLog.new('path/to/file')
cop_log.read_spreadsheet
puts cop_log.job_number

【问题讨论】:

  • 放入initialize

标签: ruby


【解决方案1】:

在调用initialize 时对象已经存在,只是还没有被初始化。所以你可以调用initialize中的方法,但是在对象的其余部分已经初始化之后再调用,尤其是@sheet

  def initialize(file)
    @creek = Creek::Book.new file
    @sheet= @creek.sheets[0]
    @cop_log = {}

    read_spreadsheet
  end

read_spreadsheetself.read_spreadsheet 的简写。 self 是调用对象initialize(或任何其他方法)。在这种情况下,self 是您新创建的 ChangeOrderLog 对象。

【讨论】:

    【解决方案2】:

    你可以在其他方法内部调用方法,initialize也不例外:

    def initialize(file)
        @creek = Creek::Book.new file
        @sheet= @creek.sheets[0]
        @cop_log = {}
        read_spreadsheet
    end
    

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      相关资源
      最近更新 更多