ruby - Ruby 中的 DRY'er 对象初始化

标签 ruby class object initialization

在 ruby​​ 中是否有更“干”的方式来执行以下操作?

#!/usr/bin/env ruby

class Volume
    attr_accessor :name, :size, :type, :owner, :date_created, :date_modified, :iscsi_target, :iscsi_portal

    SYSTEM = 0
    DATA = 1

    def initialize(args={:type => SYSTEM})
      @name = args[:name]
      @size = args[:size]
      @type = args[:type]
      @owner = args[:owner]
      @iscsi_target = args[:iscsi_target]
      @iscsi_portal = args[:iscsi_portal]
    end

    def inspect
      return {:name => @name,
              :size => @size,
              :type => @type,
              :owner => @owner,
              :date_created => @date_created,
              :date_modified => @date_modified,
              :iscsi_target => @iscsi_target,
              :iscsi_portal => @iscsi_portal }
    end

    def to_json
      self.inspect.to_json
    end

结束

最佳答案

每当你看到一长串类似的东西时,通常你可以将它们全部汇总成一个单一的数组:

class Volume
  ATTRIBUTES = [
    :name, :size, :type, :owner, :date_created, :date_modified,
    :iscsi_target, :iscsi_portal
  ].freeze

  ATTRIBUTES.each do |attr|
    attr_accessor attr
  end

  SYSTEM = 0
  DATA = 1

  DEFAULTS = {
    :type => SYSTEM
  }.freeze

  def initialize(args = nil)
    # EDIT
    # args = args ? DEFAULTS : DEFAULTS.merge(args) # Original
    args = args ? DEFAULTS.merge(args) : DEFAULTS

    ATTRIBUTES.each do |attr|
      if (args.key?(attr))
        instance_variable_set("@#{attr}", args[attr])
      end
    end
  end

  def inspect
    ATTRIBUTES.inject({ }) do |h, attr|
      h[attr] = instance_variable_get("@#{attr}")
      h
    end
  end

  def to_json
    self.inspect.to_json
  end
end

之后操作实例变量就非常简单了。

关于ruby - Ruby 中的 DRY'er 对象初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/982848/

相关文章:

c++ - 我应该上课而不是重复的 get/set 语句吗?

MATLAB 对象属性可见但不可修改

javascript - 在 javascript 中获取对象值不起作用

ruby-on-rails - 我如何强制 Rails 使用我想要的 Ruby 版本(由 rbenv 管理)?

ruby-on-rails - 如何启动 rails server localhost :3000 on ubuntu 12. 04

ruby - 在 Fedora Linux 上安装 Watir-Web 驱动程序

ruby-on-rails - 如何在 Rails 5 API 中呈现文件?

javascript - 使用 jquery 保存 javascript 对象并从数据库传递 ID

javascript删除内存泄漏安全的对象

面向对象的Java : how to create objects properly