Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中使用动态方法重构实例方法?_Ruby_Refactoring_Dynamic Method - Fatal编程技术网

如何在Ruby中使用动态方法重构实例方法?

如何在Ruby中使用动态方法重构实例方法?,ruby,refactoring,dynamic-method,Ruby,Refactoring,Dynamic Method,我想重构这个: class Collection def artists @songs.map { |song| song.artist }.uniq end def albums @songs.map { |song| song.album }.uniq end def names @songs.map { |song| song.name }.uniq end end 变成这样: class Collection song_attribu

我想重构这个:

class Collection
  def artists
    @songs.map { |song| song.artist }.uniq
  end
  def albums
    @songs.map { |song| song.album }.uniq
  end
  def names
    @songs.map { |song| song.name }.uniq
  end
end
变成这样:

class Collection
  song_attributes = [:artist, :album, :name]
  song_attributes.each do |song_attribute|
    define_method song_attribute do
      @songs.map { |song| song.public_send(song_attribute) }.uniq
    end
  end
end
问题出在第
define\u method song\u attribute do
行中,其中
song\u attribute
必须是复数。我该怎么做

我只想到了这个,但我想还有更好的办法:

song_attributes = [[:artists, :artist], [:albums, :album], [:names, :name]]
song_attributes.each do |song_attribute|
  define_method song_attribute[0] do
    @songs.map { |song| song.public_send(song_attribute[1]) }.uniq
  end
end
把绳子传进来

.....
song_attributes = [:artist, :album, :name]

song_attributes.each do |song_attribute|
  define_method("#{song_attribute}s") do
    @songs.map { |song| song.public_send(song_attribute) }.uniq
  end
end
.....