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中使用元编程来减少某些重复性,如果有人可以提供一些建议的话.
这是一个使用元编程的版本,虽然我也会通过将它放在它所属的方法中来删除重复.
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.