我正在尝试在模块文件的类中引用类变量:
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
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
实现共享行为的常用方法是需要特定的接口。例如,核心Enumerable
模块要求您实现Enumerable
才能使大多数方法起作用。 (某些方法,例如each
,需要其中的元素才能实现sort
运算符。)