如何使用元编程来减少Ruby代码中的冗余?

Con*_*wen 4 ruby metaprogramming

class Device
  def initialize(device_id, data_resource)
    @id = device_id
    @data_resource = data_resource
  end

  def display_device
    mode = @data_resource.get_display_device_mode(@id)
    presets = @data_resource.get_display_device_presets(@id)
    summary = "display_device: #{mode} ($#{presets})"
    return "* #{summary}" if presets == "XTC909"
    summary
  end

  def chip
    mode = @data_resource.get_chip_mode(@id)
    presets = @data_resource.get_chip_presets(@id)
    summary = "chip: #{mode} ($#{presets})"
    return "* #{summary}" if presets == "XTC909"
    summary
  end

  def input_device
    mode = @data_resource.get_input_device_mode(@id)
    presets = @data_resource.get_input_device_presets(@id)
    summary = "input_device: #{mode} ($#{presets})"
    return "* #{summary}" if presets == "XTC909"
    summary
  end

end
Run Code Online (Sandbox Code Playgroud)

从上面的代码中可以看出,这些方法中存在相当多的冗余.无论元编程是否是减少这种冗余的最佳方法,我希望学习如何在Ruby中使用元编程来减少某些重复性,如果有人可以提供一些建议的话.

Chu*_*uck 6

这是一个使用元编程的版本,虽然我也会通过将它放在它所属的方法中来删除重复.

class Device
  def initialize(device_id, data_resource)
    @id = device_id
    @data_resource = data_resource
  end

  def resource_summary(resource_name)
    mode = @data_resource.send("get_#{resource_name}_mode", @id)
    presets = @data_resource.send("get_#{resource_name}_presets", @id)
    summary = "#{resource_name}: #{mode} ($#{presets})"
    return "* #{summary}" if presets == "XTC909"
    summary
  end

  def self.resource_accessor(*names)
    names.each {|resource| define_method(resource) {resource_summary resource}}
  end

  resource_accessor :display_device, :chip, :input_device
end
Run Code Online (Sandbox Code Playgroud)

如果您真的不想为该功能创建方法,则可以使用resource_summary方法体替换方法调用resource_summary.