[ruby-list:50438] [質問] インスタンスメッソド hookについて
From:
<yamataka@...08.itscom.net>
Date:
2016-10-25 05:04:08 UTC
List:
ruby-list #50438
山口と申します。
インスタンスメッソド hookについて、質問させて下さい。
下記のclassのインスタンスメッソド内で、
if !@is_in_nw then … return nil end を実行している method が多数でてきた
ので、
該当部分を、hook を用いて記述すれば、綺麗なコードになるなと思い、Web等で
色々調べたのですが、
これといった方法が見当たらず、良い記述方法があれば、ご教示いただけますで
しょうか?
if !@is_in_nw the … が無いmethodや、他のクラス(別ファイルで定義)にも似た
ような箇所があるので、
それらを考慮し、クラス内にて記述できればと思っています。
http://stackoverflow.com/questions/3236194/defining-method-called-how-do-i-make-a-hook-method-which-gets-called-every-t
に記載されていた
set_trace_func proc { |event, file, line, id, binding, classname|
# only interested in events of type 'call' (Ruby method calls)
# see the docs for set_trace_func for other supported event types
puts "#{classname} #{id} called" if event == 'call'
}
だと、claass name id event で、case等を用いて記述するのがいいのかな…とは
思いつつ
や
エイリアスチェイニング http://blog.kymmt.com/entry/hook-by-alias-chaining-in-ruby
だと、多数のmethodがあるので、method内で記述した方がよいし…
と悩んでおります。
class WebAPI
attr_reader: is_in_nw
def initialize(ip,is_in_nw=false)
@ip = ip
@is_in_nw = is_in_nw
….
end
def getInformation
if !@is_in_nw then
puts "TV(#{@ip}) is not in Network"
return nil
end
….
end
def Register(code)
if !@is_in_nw then
puts "TV(#{@ip}) is not in Network"
return nil
end
….
end
def Play(function)
if !@is_in_nw then
puts "TV(#{@ip}) is not in Network"
return nil
end
…
# network上に存在しない場合、
# 以降のコードを実行すると、使用しているgem が raise を上げるのでスクリ
プトが終了してしまう
end
…
# 上の様な if !@is_in_nw then … return nil end
# を実行している method が多数あるので
# 該当部分を hook を用いて記述したい
# 中には、if !@is_in_nw the … が無い場合も考慮
end
TV_IP=’192.168.0.11’
# TV_IPを持つ機器がネットワーク上にいるか確認
if TVがネットワーク上に存在 then
is_in_nw = true
else
is_in_nw = false
end
# tv_obj 作成
tv_obj = WebAPI.new(TV_IP,is_in_nw)
tv_obj.Play(“tuner”)