[#47414] <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp>

そえじま@勉強中です。

37 messages 2010/09/17
[#47420] Re: <=>の意味は? — 藤川浩明 <fhir0aki3@...> 2010/09/17

 他の方がすでに解答されているみたいですが、一応僕なりの答えを書いてみます。僕もRuby初心者なのではっきりとは言えないんですが・・・。

[#47422] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/17

そえじま@勉強中です。

[#47424] Re: <=>の意味は? — "Y. NOBUOKA" <nobuoka@...> 2010/09/17

信岡です。

[#47426] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/17

そえじま@勉強中です。

[#47428] Re: <=>の意味は? — "Y. NOBUOKA" <nobuoka@...> 2010/09/17

そえじまさん

[#47429] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/17

そえじま@勉強中です。

[#47433] Re: <=>の意味は? — 藤川浩明 <fhir0aki3@...> 2010/09/18

 色々返答したいと思いましたが、時間が無いので「OOPの何がいいのか、いまいち分かっておりません。」の部分にのみ解答させていただきます。

[#47435] Re: <=>の意味は? — "T.Soejima" <clev@...2.so-net.ne.jp> 2010/09/18

そえじま@勉強中です。

[#47438] Re: <=>の意味は? — masayoshi takahashi <maki@...> 2010/09/18

高橋征義です。『たのしいRuby』の著者の片割れの方から来ました。

[ruby-list:47455] Re: 変数の変更を監視するには?

From: masa <masap.hat@...>
Date: 2010-09-19 13:29:47 UTC
List: ruby-list #47455
きしもとさん、出沢さん、Takahashiさん
お返事ありがとうございました!

グローバル変数ならば(きしもとさんがいわれたように)
 trace_var でフックできるというのが(調べて)わかりました。
また、通常メソッドならば p を入れれば呼び出されたのは
すぐわかりますし、アクセッサでも

  alias_method :old_var, :var
  def var
    p "fuck1"
    old_var
  end
  def var=(arg)
    p "fuck2"
    @var=arg
  end

とかなんとかすればフックできたのですが、
インスタンス変数の変更はどうしたら検知できるか
と考えていました。

set_trace_func proc

感動しました。

でもこちらでもちょっと別の例で試してみたのですが、
ちょっと奇妙?な結果が出ました。

  1 class TEST
  2   def get_var
  3     @var
  4   end
  5   def set_var
  6     @var = 100
  7   end
  8 end
  9
 10 old_v = Object.new              # `==' 的にユニークな値
 11 set_trace_func proc {|event, file, line, id, binding, klass, *rest|
 12  if event == 'line' || event == 'return'
 13    begin
 14      v = eval('@var', binding)
 15      puts "#{file}:#{line}: @var=#{v.inspect}" if old_v != (old_v = v)
 16    rescue NameError
 17    end
 18  end
 19 }
 20
 21 test = TEST.new
 22 test.set_var
 23 test.get_var

これを実行したら以下のようになりました。

$ ruby test.rb
test.rb:21: @var=nil
test.rb:6: @var=100
test.rb:23: @var=nil
test.rb:3: @var=100

ちなみに
$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin9]
です。

あれ?と思ったのは 23 行目で

test.rb:23: @var=nil

となっているところです。
ただ参照されている場合も出力されていて、おぉすばらしい、
ともはじめは思ったのですが、よく考えてみると、
一度 @var = 100 と設定されたのにまた nil になっているのは
直感的には理解できません。set_trace_func (proc_trace) や
binding の仕組みを自分が良く理解できていないせいだとは
思うのですが。

とにかく、この枠組みを使って月曜日にソースコードを調べて
見ようと思います。ありがとうございました。

masa

In This Thread

Prev Next