symbol
のスコープでeval((:symbol).id2name)
とすると,値が取り出せます.
a = 'This is the content of "a"'
b = eval(:a.id2name)
a.id == b.id
loop
は制御構造ですかメソッドです.ブロックは新しいローカル変数のスコープを導入します.
instance_methods(nil)
は何を返しますかinstance_methods
は,あるクラスのオブジェクトが持つメソッドを返しますが,
instance_methods(nil)
は,スーパークラスから引き継いだものではなく,その
クラスで初めて定義されたメソッドを返します.
nil
とfalse
はどう違いますか持っているメソッドの違いは,nil.methods
- false.methods
と
false.methods
- nil.methods
を表示してください.
ハッシュでは,nil
を値として持つことができませんが,
false
を持つことはできます.
?
のつくメソッドは,真偽を返す場合はtrue
,false
を,
そうでない時は値もしくはnil
を返します.
open("example", "w+").readlines.each_with_index{|l, i|
l[0,0] = (i+1).to_s + ": "}
とやっても,example
に行番号がつきません.
ファイルを書き換えているのではなく,readlines
で読み込んだ文字列を変えて
いるだけです.ファイルに書き戻してやらなければいけません.
io = open("example", "w+")
ary = io.readlines
ary.each_with_index{|l, i| l[0,0] = (i+1).to_s + ": "}
io.rewind
io.print ary
io.close
Dir.glob("*").filter{|f| [File.mtime(f), f]}.
sort{|a,b| b[0]<=>a[0]}.filter{|e| e[1]}
とすると,カレントディレクトリの".",".."以外のファイルを更新時間の
新しい順にソートした配列を返します.
ファイルの最後にも改行があるものと仮定して,次のが一番速いでしょう.
open("file").read.delete("ˆ\n").size
:exit
というのは何ですかシンボルと呼ばれる,識別子と1対1対応する整数(Fixnum
)です.
ary.filter{|f| [f.downcase, f]}.sort.filter{|e| e[1]}
とします.downcase
で等しくなった場合に,元の文字列で比較を行うのが
tipsです.
split(//)やscan(/./)を使います.
"abcd"[0]
は,何を返しますか文字aのコード97(Fixnum)を返します.これが文字aと一致するかどうか 調べるには,?aと比較します.
aに展開したい文字列があるとして,次のどちらかを使えばいいでしょう.
1 while a.sub!(/(^[^\t]*)\t(\t*)/){$1+' '*(8-$1.size%8+8*$2.size)}
1 while a.sub!(/\t(\t*)/){' '*(8-$~.begin(0)%8+8*$2.size)}
Regexp.quote
('\\')で,エスケープされます.
gsub
を使う場合には,gsub
(/\\/, '\\\\')では,置換文字列が構文解析で
一度'\\'に変換され,実際に置き換えるときにもう一度'\'と
解釈されるので,
gsub
(/\\/, '\\\\\\')とする必要があります.\&がマッチ文字列をあらわす
ことを使えば,gsub
(/\\/,'\&\&')と書けます.
gsub(/\\/){'\\\\'}とブロックを使う形にすれば,エスケープが1回しか 解釈されませんので,求める結果が得られます.
'\1'
と'\\1'
はどう違いますか同じです.シングルクォートの中では,\'
と\\
だけが解釈され,それ
以外は解釈されません.
sub
とsub!
はどう違うのですかsub
の場合はレシーバの状態は変化せず,コピーにsubが施されます.
sub!
ではレシーバそのものが変更されます.
sub!
のようにレシーバの状態を変化させるメソッドを破壊的メソッドと
呼びます.Rubyでは同名のメソッドで破壊的なものとそうでないものがある場
合,破壊的なメソッドには慣例的に!
をつけます.
def foo(str)
str = str.sub(/foo/, "baz")
end
obj = "foo"
foo(obj)
print obj
# -> "foo"
def foo(str)
str = str.sub!(/foo/, "baz")
end
foo(obj)
print obj
# -> "baz"
sub!
のように破壊的なメソッドは予期しない効果をもたらすことがある
ので,使用する場合は十分注意してください.
..
と...
はどう違いますか..
は終端を含み,...
は終端を含みません.
Proc.new
,proc
,lambda
でProcオブジェクトを作れば,
関数ポインタのような働きをさせることができます.
thread
とfork
はどう使い分けるのですかthread
/fork
はそれぞれ以下のような特徴を持っています.
fork
は重い/thread
は軽いfork
はメモリ空間を共有しないfork
の切替えのタイミングは不正確/thread
はもっと不正確thread
ではスラッシングが起きないthread
はDOSでも動くthread
がなんらかの理由でブロックすると全体が止まる一般にfork
とthread
を混ぜるのはよくないようです.
あと,Rubyのthread
はタイムシェアリング方式なので,thread
を使
うことによって処理が速くなることはありません.
オブジェクトをファイルや文字列に格納しておき,後で再生できる ようにするものです.格納は
Marshal.dump obj, io, lev
という形式で行います.ioには書き込み可能なIOオブジェクト,levは
オブジェクトが内容として他のオブジェクトを持っている時に,どこ
までオブジェクトの内容を格納するかを決めます.lev段までオブジェクト
をdumpしてもまだオブジェクトがある時には,そのオブジェクトのdumpは
オブジェクトの参照になりますので,再生した時には,参照が変わって
いるでしょうから,再生できないことになります.levのデフォルトは
100になっています.ioを省略した時には,文字列でdumpされます.
再生は
obj = Marshal.load io
または,
obj = Marshal.load str
という形式で,ioはdumpしたファイルを読み込み可能でopenしたもの,
strはdumpした文字列を指定します.
他の先進的な言語と同様にRubyも例外処理をサポートします.
begin
(例外が発生しそうな処理)
rescue (例外クラス)
(例外が発生した場合の処理)
ensure
(必ず実行したい処理)
end
begin
節で例外が発生するとrescue
節が実行されます.
ensure
節は例外が発生してもしなくても必ず実行されます.rescue
やensure
は省略できます.rescure
の後ろに例外クラスが
指定されなかった場合は
StandardError
が指定されたものとみなされ,StandardError
の
サブクラスである例外が捕捉されます.
この式の値は,begin節の値です.
もっとも最近起った例外はグローバル変数$!
により参照できます.
発生した例外の種類は$!.type
により調べることができます.
trap
はどのように使いますか
trap("PIPE") {raise "SIGPIPE"}
お使いのTkのバージョンが古い可能性があります.新しいものと交換してみて ください.
あります.Rubyを次のように起動してください.
ruby -r debug your_script