[ruby-list:50458] Re: [質問] classから作成したインスタンスから作成元のclassのインスタンス変数を参照するには
From:
<yamataka@...08.itscom.net>
Date:
2016-11-08 07:17:58 UTC
List:
ruby-list #50458
市田さん
山口です。
いつもご教示ありがとうございます。
> ...、render メソッドを単なるアクセッサメソッドとせずに
> @is_in_nw が false の場合は、render メソッドが false を返すとか
> 、例外とする手もあります。これだとDeviceクラス側の処理で済みます。
def render とするのでしょうか。
下記ソース内でコメントで記載しましたが
# obj.render.SetMuteやobj.render.Play で呼び出されているのを、@renderイ
ンスタンスmethodを呼び出す記述が分からない
や
# obj.render が nil なので undefined method `SetMute' for nil:NilClass (
NoMethodError) でスクリプ終了されると困る
をdef render 内に記述をどうすればいいのかが分からず...
class Render
def initialize(service)
@service = service
end
def SetMute(sw)
puts "#{__method__} is executed!"
end
def Play
puts "#{__method__} is executed!"
end
### 他にも多数method有
end
class NetWorkAudioDevice
attr_reader :is_in_nw
def initialize(device,is_in_nw)
@is_in_nw = is_in_nw
if @is_in_nw then
service = "service"
@render = Render.new(service)
else
@render = nil
end
end
def render
if @is_in_nw then
puts "in network!"
# obj.render.SetMuteやobj.render.Play で呼び出されているのを、@
renderインスタンスmethodを呼び出す記述が分からない
else
puts "not in network!"
# obj.render が nil なので undefined method `SetMute' for nil:
NilClass (NoMethodError) でスクリプ終了されると困る
end
end
end
# Network上に master機器存在 is_in_nw true でインスタンス作成
mdevice="192.168.0.2"
master = NetWorkAudioDevice.new(mdevice,is_in_nw=true)
# Network上に slave 機器存在しない is_in_nw false でインスタンス作成
sdevice="192.168.0.3"
slave = NetWorkAudioDevice.new(sdevice,is_in_nw=false)
master.render.SetMute(true) # Render method SetMute実行を期待
slave.render.SetMute(true) # NetWorkAudioDevice render method で return
nil かで何も処理をしないようにしたい。
> ただこう考えてくると
> - @is_in_nw が false の場合でも Render などのインスタンスを作成する意
味
> があるか
あまり意味をなさなくなってしまうのは、承知しておりまして。
network上に存在しようがしまいが、インスタンスを作成して、呼び出しを
master.render.SetMute(true)
slave.render.SetMute(true)
揃えたい。
しかし、ネットワーク上に存在しない場合、そのまま呼び出すと、内部で用いて
いるgemがRaiseし、スクリプトが終了して困るので、
それを回避したいのです。
また、他のメンバーの利用も考えており、network上に機器が存在しなかった場
合をの事をコード上であまり意識させたくないので、
機器が存在しない場合は、内部で何も実行せず、メッセージを表示するのみにし
たいと考えています。
>- 作成したとして、その場合に呼びされたインスタンスメソッドは @is_in_nw
>の値に従ってどう振る舞うのが良いか
上述しました内部で何も実行せず、メッセージを表示するのみと考えています。
>- @is_in_nw は動的に変わるのか、それともDeviceインスタンス生成時に指定
し
>た以降変化するのか
現時点では、Deviceインスタンス生成時で後変化せずに、しております。
考慮に入れなければと思っておりますが...
>など、クラスにどのような役割をもたせるのかなど、クラス設計の話になるの
で
>はと思います。
ご尤もです。
質問していて、Rubyでの記述方法での質問部分もありますが、クラス設計に関し
ての
質問の色合いが強いですね。
オブジェクト指向言語は、Rubyで初めてでして...
知識レベルが足りない部分を考慮していただき、ご教示いただけると幸いです。