[ruby-list:50456] [質問] classから作成したインスタンスから作成元のclassのインスタンス変数を参照するには
From:
<yamataka@...08.itscom.net>
Date:
2016-11-07 06:54:07 UTC
List:
ruby-list #50456
山口と申します。
classから作成したインスタンスから作成元のclassのインスタンス変数を、参照
できるのか?
下記の様なコードにおいて、何かいい方法があればご脅威いただけますでしょう
か?
class Render
def initialize(service)
@service = service
end
...
def SetMute(sw)
@service.SetMute(sw)
end
end
class NetWorkAudioDevice
attr_reader :is_in_nw
def initialize(device,is_in_nw)
@is_in_nw = is_in_nw
...
@webapi = WebAPI.new(@ip,api_port)
@render = Rendering.new(device.service)
@avtransport = AVTransport.new(device.service)
end
end
# Network上に master機器発見 is_in_nw true でインスタンス作成
master = NetWorkAudioDevice.new(device,is_in_nw=true)
# Network上に slave 機器存在しない is_in_nw false でインスタンス作成
slave = NetWorkAudioDevice.new(device,is_in_nw=false)
#1
master.render.SetMute(true)
#2
slave.render.SetMute(true) # RenderクラスのSetMute内 @service.SetMute 呼
び出し後、Gem内で機器に対するserviceが存在しないため、Raiseし、スクリプ
トが停止する
#3
if slave.is_in_nw then # 毎呼び出し時に、instanceのis_in_nwを確認する
slave.render.SetMute(true) # 各method呼び出しに、上の条件をつける必要が
有りコードが煩雑になる。
end
#4
slave.render.SetMute(true) # Renderクラス SetMute内で、is_in_nwを確認し、
@service.SetMuteを呼び出すか呼び出さないか判断したい。
# 4の様にするには、
class Render
def initialize(service,is_in_nw)
@service = service
@is_in_nw = is_in_nw
end
...
def SetMute(sw)
if @is_in_nw then
@service.SetMute(sw)
else
puts "#{__method__} is not called due to XXX is not in network"
end
end
end
class NetWorkAudioDevice
attr_reader :is_in_nw
def initialize(device,is_in_nw)
@is_in_nw = is_in_nw
...
@webapi = WebAPI.new(@ip,api_port,@is_in_nw)
@render = Rendering.new(device.service,@is_in_nw)
@avtransport = AVTransport.new(device.service,@is_in_nw)
end
end
各WebAPI,Rendering,AVTransportをインスタンス作成する際に、@is_in_nwを渡
し、
それぞれの関数内で、判別するしかないのかでしょうか?
NetWorkAudioDevice class内から、それぞれWebAPI,Rendering,AVTransportのイ
ンスタンスを作成しているので、
インスタンス作成時に、@is_in_nwを渡さなくても、参照できるんいい方法があ
るんじゃないか?
と思う反面
インスタンスから他のインスタンスの値を参照するmethodが必要になるので、前
述のようには、できないだろう
とも想像がつくのですが...
何かいい方法があれば、ご教示いただければと思います。