疑問を整理 ・ トップレベルに定義されたメソッドと定数は Object に所属することになっている(これはとりあえずそういうものだと理解する) ・ が、モジュール M に対する M.ancestors は [M] だけを返し、Object が含まれていないので Object が見えないはずでは? てきとーな回答 irb> module M; end irb> p M.class Module irb> p M.class.superclass Object superclass の定数がインスタンス内から読めるのは当たり前 …という説明で納得して頂けますでしょうか たぶんもっとわかりやすくて本質的な説明をしてくれる勇者様がきっと irb> class SUPERCLASS; end irb> class CLASS < SUPERCLASS; end irb> o = CLASS.new irb> SUPERCLASS.const_set(:CONST,"superclass!") irb> p o.class CLASS irb> p o.class.superclass SUPERCLASS irb> class << o; p CONST; end "superclass!"
20 :
あRほどそういうことか ありがと
21 :
ようするにこういう状態ですよね Moduleのインスタンスだってことを見落としてた class Module < Object def foo # ここからObjectの定数が見える end end
class Module X = 0 def foo X end end module M; end M.foo #=> 0 module M; X; end #=> NameError あれ?
24 :
>>18 5番目 (Object) class ×; end class 3番目 < × class 2番目 < × class C < 4番目 include 1番目 p CONST end end end まずinclude/extendを探し、次にスクリプト上のネストを探し、さらに継承元を探し、最後にObjectクラスを探してCONSTがなかったらエラー class A1; CONST="A!" class B1; CONST="B!" class C1; CONST="C!"; end class C < C1; p CONST; end end; end #=> "B!" class A2; CONST="A!" class B2; class C2; CONST="C!"; end class C < C2; p CONST; end end; end #=> "A!" class A3; class B3; class C3; CONST="C!"; end class C < C3; p CONST; end end; end #=> "C!" これはそういう順番になるように作ってあるとしか言えない、でいいと思う
25 :
>>23 class Module X=0 end module M p self #=> M # M=Module.new なので、C::CONST や C.new.class::CONST は読めても C.new::CONST が読めない理屈と同様、Module::X はここから読めない end class << M p self #=> #<Class:M> # Classの継承元には Module が含まれているのでふつうに読めるというか、回答でこれを出した>>19が間違ってるんだな end
26 :
結局>>18の見える理由はなんなんだろう 「例外的にそうなってます」でいいのか、それとも 「○○の範囲が見えて、その中にObjectも含まれています」みたいな説明が可能なのか 今の所こういう感じじゃないかと思ってるんだけど違うかな module A; end とか class A; end の中では以下の順で探索 1 ネストを外側に向かって。ただしトップレベルは含まない 2 継承元に向かって探索(include したモジュールも継承扱い。つまりM.ancestors) 3 Objectから継承元に向かって探索(Object.ancestors。classの場合は2に含まれる) >>18のページの記述は3が抜けてる?
27 :
あ、書き直し漏れがあった × M.ancestors ○ A.ancestors
28 :
質問よろしいでしょうか。 a = gets.chomp while a != "BYE" puts "what?" a = gets.chomp end このプログラムをwhat?と聞き返されるたびにBYEと入力して、の繰り返しで三回目にそのループから抜けられるようにするにはどうすればよいでしょうか?
n = 0 while n < 3 puts "what?" gets.chomp == "BYE" ? n += 1 : n = 0 end 標準ライブラリだとプロンプトを引数にとるメソッドはないんだっけ? read_input("what?:") みたいなの
39 :
いろいろ考えてくださってありがとうございます!知識がなくて皆さんの言っていることは全然わかりませんが・・勉強します。 変化を加えてみました。 puts "Say \'bye\' to that old woman." n=0 while n<3 a=gets.chomp n += 1 if a=="BYE" puts "What? I can\'t hear your voice well." end puts "OK." これだと三回目のBYEを入力したあとにWhat? I can\'t hear your voice well.と表示されてしまいます。 三回目のBYEの後はOKだけ表示されるようにしたいのですが、どうすればよいでしょうか?
>>37 puts "Say \'bye\' to that old woman." [["","",""]].cycle do | c | print "what?" a = gets.chomp p a c << a c.shift c[0] == "BYE" and c[1] == "BYE" and c[2] == "BYE" and break puts "What? I can\'t hear your voice well." end puts "OK."
self.signal_connect("delete_event") do Gtk.main_quit end self.signal_connect("key-press-event") do |w, e| if e.keyval == Gdk::Keyval::GDK_q Gtk.main_quit end end end end url= 'http://www.astroarts.jp/news/2005/05/09hubble_anniversary/m51.jpg' image = Gtk::Image.new(open(url,"rb").read) main_win = Win.new main_win.add(image) main_win.show_all Gtk.main
複数のデータの組をまとめて扱いたい程度のときに便利。 initializeと読み書きアクセサしかないようなクラスを作るイメージ。 LogEntry = Struct.new(:issuer, :severity, :timestamp, :message) 定型的なアクセサの生成をStructに任せ、返ってきた 無名クラスを継承して振るまい(メソッド)だけ追加する例。 class Location < Struct.new(:latitude, :longitude, :altitude) def country end end
68 :
>>67のように迂闊に使うとめんどくさいことになることは異論を待たない initialize とアクセサメソッドが欲しいのならアクセサメソッドだけ定義しろ class Location attr_accessor :latitude :longitude :altitude def country end end 使い道が思いつかない、または、他の手段で代替可能なのなら、絶対に使うべきではないクラス
69 :
説得力皆無です
70 :
>>67 はっああああああ?? それやると、selfからみれなくなるけどいいの???? 複雑になるだけじゃないの??この動作知ってた?知ってた?ネェ知ってたー?WWW知らなかったのかな!!!!wwwwwっうひゃwwwっうぇwwwww class Location < Struct.new(:latitude, :longitude, :altitude) attr_accessor :x def initialize @x = 6 end def country self.latitude = 3 p self.latitude # => 2 p @latitude # => nil p self.x # => 6 p @x # => 6
end end Location.new.country
71 :
すみません、値を間違えました p self.latitude # => 2 は p self.latitude # => 3 です
Structの活用は、メソッド内とかでちょっと構造体やらクラスっぽいのが必要になった時の 定義する時の文字数の違いとか、そのくらいだと思われる def func a = Struct.new(:x,:y).new p a.x = 2 a = Class.new { attr_accessor :x,:y }.new p a.x = 4 end func
質問です オブジェクトに追加した特異メソッドの削除を行いたいと思ったんですけど instance_eval→undefしか方法が見つかりませんでした、 remove_methodやundef_methodはないみたいなんですけど特異メソッドの削除の方法ってこれしかないですか? a = Object.new def a.f p 2 end a.f a.instance_eval do undef_method :f rescue p "err0" remove_method :f rescue p "err1" undef :f end a.f rescue p "err2"
79 :
>>78 a = Object.new def a.a ; p :a_a ; end def a.b ; p :a_b ; end a.a a.b class << a remove_method :a undef_method :b end a.a rescue p :no_a a.b rescue p :no_b
内部動作意味不明ですけど ブロックじゃなくてlambdaで渡したらうごきましたもういいです class B < Enumerator def initialize h a = super do|y| loop{ y.yield 1 } end p a.next # => 5 a = super &(lambda do|y| loop{ y.yield 1 } end) p a.next # => 1 end end B.new [5,6,7]
97 :
質問です :aaaa ってやると p Symbol.all_symbols ここに追加されますけど、 p Symbol.all_symbols.size 1_000_000_0.times do|i| :"#{i}" end p Symbol.all_symbols.size このくらい生成してやると `intern': symbol table overflow (symbol 2095337) (RuntimeError) こうなる事が分かりました いらなくなったシンボルを削除する方法ってあるんでしょうか?
98 :
無理っぽいですね シンボルは大事に使っていくことにします
99 :
Cursesと、Term::ANSIColor for Rubyを使って、コンソールでシンタックスハイライトができるテキストエディタを目指し作っているのですが、以下のリポジトリのmain.rbを実行すると、最初の文字「1」が黒字になるというバグが発生します。 このプログラム(main.rb)は、README.rbを読み込んで、出力するものです。 https://github.com/217/VMacs このバグに2時間ほど悩んだのですが、どうにも解決できませんでした。 ライブラリの相性の問題なのでしょうか? わかる方がいらっしゃったら、教えてください。