加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:50:53 所属栏目:百科 来源:网络整理
导读: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
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

从上面的代码中可以看出,这些方法中存在相当多的冗余.无论元编程是否是减少这种冗余的最佳方法,我希望学习如何在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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读