[ruby-list:50460] Re: [質問] classから作成したインスタンスから作成元のclassのインスタンス変数を参照するには
From:
Toshihiko Ichida <dogatana@...>
Date:
2016-11-08 12:33:13 UTC
List:
ruby-list #50460
市田です。
On 2016/11/08 16:17, yamataka@u08.itscom.net wrote:
> network上に存在しようがしまいが、インスタンスを作成して、呼び出しを
> master.render.SetMute(true)
> slave.render.SetMute(true)
> 揃えたい。
> しかし、ネットワーク上に存在しない場合、そのまま呼び出すと、内部で用いて
> いるgemがRaiseし、スクリプトが終了して困るので、
> それを回避したいのです。
>
> また、他のメンバーの利用も考えており、network上に機器が存在しなかった場
> 合をの事をコード上であまり意識させたくないので、
> 機器が存在しない場合は、内部で何も実行せず、メッセージを表示するのみにし
> たいと考えています。
設計、I/Fの是非はともかく、上のことをあまり手間をかけずに実現するとして
class StubMethod
def initialize(obj)
@obj = obj
end
def method_missing(name, *args)
super unless @obj.respond_to? name
puts "#{name} does not work"
end
end
class Render
def play
puts "Render#play"
end
end
class Device
attr_reader :render
def initialize(device, is_nw_in)
@device = device
render = Render.new
@render = if is_nw_in
render
else
StubMethod.new(render)
end
end
end
という方法はどうでしょう。
Render のインスタンスを生成して、そのインスタンスが応答できるメソッド
が呼ばれたら何らかのメッセージを出すというものです。
応答できないもの=Render にないメソッドを呼び出したときは、いつもどおり
NoMethodError になります。
もしくは, class を引数にするのでも良いです。
class StubMethod
def initialize(klass)
@klass = klass
end
def method_missing(name, *args)
super unless @klass.instance_methods.include? name
puts "#{name} does not work"
end
end
class Device
attr_reader :render
def initialize(device, is_nw_in)
@device = device
@render = if is_nw_in
Render.new
else
StubMethod.new(Render)
end
end
end
ではでは。