如何在Ruby的模块文件中引用类之外的类变量

问题描述 投票:0回答:2

我正在尝试在模块文件的类中引用类变量:

require 'pry'
require_relative '../lib/concerns/memorable'

class Song
  extend Memorable::ClassMethods
  extend Findable::ClassMethods
  attr_accessor :name
  attr_reader :artist

  @@songs = []

  def initialize
    @@songs << self
  end

  # def self.find_by_name(name)
  #   @@songs.detect{|a| a.name == name}
  # end

  def self.all
    @@songs
  end

  # def self.reset_all
  #   self.all.clear
  # end
  #
  # def self.count
  #   self.all.count
  # end

  def artist=(artist)
    @artist = artist
  end

  def to_param
    name.downcase.gsub(' ', '-')
  end
end
module Findable
  module ClassMethods

    def all
      @@artists
    end

    def all
      @@songs
    end

    def find_by_name(name)
      @@songs.detect{|a| a.name == name}
    end

    def self.find_by_name(name)
      @@artists.detect{|a| a.name == name}
    end

 end

end

ruby
2个回答
0
投票

签出class_variable_get

    module Findable
      module ClassMethods

        def all
          self.class_variable_get(:@@songs)
        end

        def find_by_name(name)
          self.class_variable_get(:@@songs).detect{|a| a.name == name}
        end

      end
    end

0
投票

实现共享行为的常用方法是需要特定的接口。例如,核心Enumerable模块要求您实现Enumerable才能使大多数方法起作用。 (某些方法,例如each,需要其中的元素才能实现sort运算符。)

© www.soinside.com 2019 - 2024. All rights reserved.