Tre*_*r O 14 ruby initialization class object
是否有更"干"的方式在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
Run Code Online (Sandbox Code Playgroud)
结束
tad*_*man 12
每当你看到很多类似的东西时,通常你可以把它全部卷成一个奇异的数组:
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
Run Code Online (Sandbox Code Playgroud)
之后操作实例变量非常简单.
class Volume
FIELDS = %w( name size type owner iscsi_target iscsi_portal date_create date_modified)
SYSTEM = 0
DATA = 1
attr_accessor *FIELDS
def initialize( args= { :type => SYSTEM } )
args.each_pair do | key, value |
self.send("#{key}=", value) if self.respond_to?("#{key}=")
end
end
def inspect
FIELDS.inject({}) do | hash, field |
hash.merge( field.to_sym => self.send(field) )
end.inspect
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6431 次 |
| 最近记录: |