[#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:47469] Re: 変数の変更を監視するには?

From: masa <masap.hat@...>
Date: 2010-09-21 06:33:43 UTC
List: ruby-list #47469
遠藤さん

どうもありがとうございました。納得?!です。

> 最初の@var=nilが出てくるのは、TEST.newのTESTが評価
> された時のようです。トップレベルの@varが出力されています。

トップレベルの@var?

というところでちょっと引っ掛かっていますが
ということはインスタンス変数を定義するとトップレベルでも
その変数が評価されている?ということですね。
# 別のところで疑問がわき出ていますが。。。

----
ちなみにその後の報告ですが、
問題のソースコードですが initialize メソッドが呼び出されずに
インスタンスが生成されていた理由は Marshal データをロード
してオブジェクトを再生していたからでした。
# ガッテン!!

で、その探索過程で Takahashi さんから教えてもらった

set_trace_func

をプログラムの初めに挿入したら、時間はかかるし、
なぜか Abort しまくりだったので適当な場所に的を絞って使うこと
にしました。

ちなみに set_trace_func nil とすることで一度設定した set_trace_func proc
をオフにすることができました (tracer.rb profiler.rb から)。

ということでもしかしたら今後のデバッグに役立つかもといことで
メソッドにまとめておきました。(改良の余地はありそうですが)
以下を実行すると2番目の foo のときには普通に実行されます。

trace_local_var.rb
----
def trace_local_var(var)
  old_var      = Object.new
  #set_trace_func proc {|event, file, line, id, binding, klass, *rest|
  set_trace_func lambda {|event, file, line, id, binding, klass, *rest|
    if event == 'line' || event == 'return'
      begin
        v = eval(var, binding)
        puts "#{file}:#{line}: #{var}=#{v.inspect}" if old_var != (old_var = v)
      rescue NameError
      end
      #puts "#{file}:#{line}:#{id}:#{klass}:#{event}"
    end
  }
end

def untrace_local_var
  set_trace_func nil
end
----


test.rb
----
require 'trace_local_var'

def foo
 x = 10
 100.times do |i|
   x = i if i % 30 == 0
 end
end

trace_local_var('x')
foo
p "====="
untrace_local_var
foo
----


みなさんありがとうございました。
masa

In This Thread