首页 > 解决方案 > 为什么我可以在这里调用类方法,就好像它是实例方法一样?

问题描述

我正在查看这个例子:

class SQLObject
  def self.columns
    return @columns if @columns
    columns = DBConnection.execute2(<<-SQL).first
      SELECT
        "#{table_name}".*
      FROM
        "#{table_name}"
      LIMIT
        0
    SQL
    columns.map!(&:to_sym)
    @columns = columns
  end

  def self.table_name
    @table_name ||= self.name.underscore.pluralize
  end

  def insert
    column_symbols = self.class.columns.drop(1)
    column_names = column_symbols.map(&:to_s).join(", ")
    question_marks = (['?'] * column_symbols.count).join(", ")
    DBConnection.execute(<<-SQL, *attribute_values)
      INSERT INTO
        #{self.class.table_name} (#{column_names})
      VALUES
        (#{question_marks})
    SQL
    self.id = DBConnection.last_insert_row_id
  end
end

我很困惑为什么可以在“self.columns”方法中调用 table_name 方法,就好像它是一个实例方法一样。“table_name”方法不是类方法吗?因此,它不应该在“self.columns”方法中也被称为“self.class.table_name”吗?

标签: sqlrubymetaprogramming

解决方案


在抽象类中时,self指的是正确的类,而不是对象。这就是为什么您无需明确告知即可访问该方法的原因self


推荐阅读