【发布时间】:2015-11-30 08:27:03
【问题描述】:
我有两节课。
class Sky
attr_accessor :args
def initialize(args)
@args = args
puts 'Initializing sky'
end
end
class ShadowMask
attr_accessor :sky
def initialize(args)
args.each{|k, v| p "#{k}: #{v.to_s}"}
@sky = args.fetch(:sky, Sky.new({}))
end
end
ShadowMask 可以使用默认的Sky 创建:
sm_default = ShadowMask.new({})
# Initializing sky
# => #<ShadowMask:0x007fa215230eb0 @sky=#<Sky:0x007fa215230e60 @args={}>>
sm_default.sky
# => #<Sky:0x007fa215230e60 @args={}>
sm_default.sky.args
# => {}
或者使用之前创建的Sky:
skyobj = Sky.new("Sky Object")
# Initializing sky
# => #<Sky:0x007fa21481a020 @args="Sky Object">
sm = ShadowMask.new(:sky => skyobj)
# "sky: #<Sky:0x007fa21481a020>"
# Initializing sky
# => #<ShadowMask:0x007fa21521ae80 @sky=#<Sky:0x007fa21481a020 @args="Sky Object">>
在第二种情况下,Sky 的实例已经存在,我不想看到 Sky 初始化的输出 Initializing sky。
我的实际代码的问题在于
puts 'Initializing sky'
是对执行若干计算以完成初始化并设置若干属性的方法的调用。每次创建 ShadowMask 时都会重复此操作。
有趣的是,如果我替换
@sky = args.fetch(:sky, Sky.new({}))
类似
@sky = args.fetch(:sky, 'AnyString')
它工作正常,但如果需要,我会放弃创建新 Sky 的可能性。
我不确定问题出在语法上,还是我犯了概念上的错误。
【问题讨论】:
标签: ruby oop hash initialization-list