gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:49 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com