2006-03-01から1ヶ月間の記事一覧

String#sum

String#sum(bits=16)は単純なサムチェックを取るメソッドです。引数はビット数。 疑問:ri sumには「the sum of the binary value of each character in _str_ modulo +2n - 1+」と書いてありますが、modulo $2^{n}$ではないでしょうか?(- 1がいらないとい…

refeのオプション

Rubyで調べ物をするときに、refeも欠かせません。 refe --help refeの使い方を表示します。 refe 全部のクラスを表示します。 refe cgi CGIを含むクラスを表示します。 refe s up String#upcase String#upcase! String#uptoを表示(単語は省略して入力できる…

変数$?とtexpdf.rb

texpdf.rbは、pLaTeX→PDF変換をするバッチファイル的なスクリプトをRubyで書いたものです。 目次生成のためにplatexを二回走らせるのですが、何らかのエラーが起こってplatexのXコマンドで終了したときにはtexpdf.rbを中断するように修正しました。 ri syste…

標準出力のリダイレクト

IO#reopenを使うと、リダイレクトができます。 以下のプログラムでは、標準出力をoutput.txtというファイルにリダイレクトしています。"a"を使っているので毎回追加になります。>> output.txtということですね。"w"を使えば > output.txtになります。 詳しく…

riのオプション

Rubyで調べ物をするときに、riは欠かせません。 ri --helpでriのオプションを調べることができます。 ri -c でクラスとモジュールの一覧が得られます。 ri -l でメソッドなどまで含めたすべての名前の一覧が得られます。

!が着いたメソッド探し

ObjectSpaceを使って、!が着いたメソッド探しをしましょう!(←これは感嘆符) name = Array.new ObjectSpace.each_object(Class) do |c| c.instance_methods(false).each do |mname| # super not included if /\!$/ =~ mname name << "i #{c.to_s}##{mname}"…

Array#transpose

Array#transposeは、二次元配列を行列に見立てて 転置行列を得ます。 require 'pp' a = [ [ 11, 12, 13 ], [ 21, 22, 23 ], [ 31, 32, 33 ], [ 41, 42, 43 ], ] PP.pp(a, STDOUT, 20) PP.pp(a.transpose, STDOUT, 20)実行結果です。 [[11, 12, 13], [21, 22,…

条件に置いたif

Rubyのif文は値を持つので、ifの条件にif文を書くこともできます。 if (if (if (if (if (if true; 'H' end); 'e' end); 'l' end); 'l' end); 'o' end); puts "Hello" #=> Hello end

Class.new

Class.newを調べようと思ってri Class.newしたら以下のように怒られてしまいました。 私の理解ではClass.newとClass::newはほぼ同じで、メソッドのときには . を使い、定数の時にはスコープを表現するというニュアンスで::を使うのが望ましいと思っていまし…

メソッド[]

当然ながら、(i, x)としてメソッドを定義すると、a[123,456,789]などは書けなくなります。 class Rubyco def [](i, x) puts "i=#{i}, x=#{x}" end def []=(i, v) puts "i=#{i}, v=#{v}" end end a = Rubyco.new a[123] = 456 #=> i=123, v=456 a[123,456] #=…

局所変数の作り方

代入されると局所変数ができるのだとしたら、その場所の環境を使って代入文をevalすれば局所変数を別の箇所で作ることができるのではないかのテストです。 make_localvarで局所変数を作ろうと思ったのですが、以下の通り、結果は失敗でした。ri variableでさ…

Marshalでdeep copy

Object#dupはshallow copyですけれど、Marshal.dumpとMarshal.loadでdeep copyになります。 a = ["A", ["B", "C"]] # dup - shallow copy b = a.dup p a == b #=> true p a.object_id == b.object_id #=> false p a[0].object_id == b[0].object_id #=> true…

Complexクラスと!のついたメソッド

Complexは複素数です。 require "complex" c = Complex(1, 2) p c #=> Complex(1, 2) p c.real #=> 1 p c.image #=> 2 p c.arg #=> 1.10714871779409 p c.polar #=> [2.23606797749979, 1.10714871779409] p c.conjugate #=> Complex(1, -2) d = Complex(-1,…

String#crypt

str = "Hello!" salt = 'Ru' p str.crypt(salt) #=> "RuCxC/z89s/D2"

cryptの使い方

前もってcryptで作っておいた結果(saved_secret)を、次回はsaltとして使います。 実際にはsaltは乱数を使います。 password = "PaSsWoRd" salt = 'Ru' saved_secret = password.crypt(salt) #=> "RukFhTZDMvlF6" [ "password", "test", "guestguest", "PaSsW…

SIGALRM

眠いので、sleepを調べました(なぜ)。 ri Kernel#sleepを読むと「スレッドがSIGALRMでインタラプトされると、指定した時間よりも短い時間で帰ってくる」ようなことが書かれていました。 疑問:スレッドに対してSIGALRMを送る方法は? Thread.kill, Thread#…

callerとalias

callerとaliasを使うと、異なる名前で呼ぶとそれに応じた処理を行うRubyメソッドが作れるという話題がありました。なるほどです。

Proc#binding

Proc#bindingは、そのProcに関連づけられたBindingオブジェクトを返します。 詳しくはri Proc#binding参照。以下のサンプルも、ri Proc#bindingを元にしています。 def rubyco(x, y) x += 1 y += 2 proc { } end pc = rubyco(0, 0) p eval("[x, y]", pc.bind…

Errno

errno のリストもほしいと書かれていたので調べてみました。 プラットホーム固有のOSのエラー一覧は、Errno.constantsで得ることができます。 require 'pp' pp Errno.constants実行結果です。 ["EINTR", "EMFILE", "EILSEQ", "ENOBUFS", "EADDRINUSE", "EDQU…

capitalize

何となくString#capitalizeを作ってみた。 class String def mycapitalize if /(.)(.*)/ =~ self $1.upcase + $2.downcase else "" end end end追記:もう少し短くできますね。 class String def mycapitalize if /(.?)(.*)/ =~ self $1.upcase + $2.downcas…

0と""

Rubyでは、0も""も真偽値の「真」になります。 p !!0 #=> true p !!"" #=> true (warning: string literal in condition)

nilとfalse

Rubyの「偽」はnilとfalseだけです。 p !!nil #=> false p !!false #=> falseでも、nilとfalseは等しくありません。 p (nil == false) #=> false

SyncEnumerator

rucilaさんの日記を見て、enumeratorという単語で調べていたら、SyncEnumeratorというクラスを発見しました。何が'sync'なのだろうと思いましたが、require 'generator'を見つけて納得です。 require 'generator' enumerator = SyncEnumerator.new(["A", "B"…

Signal.list

Signal.listで、シグナル名とシグナル番号の一覧がハッシュで得られます。 s = Signal.list p s p s.sort p s.sort {|a, b| a[1] <=> b[1]} s.sort {|a, b| a[1] <=> b[1]} .each do |sig_val| printf("%-6s %d\n", sig_val[0], sig_val[1]) endそうか、Ruby…

Resolv

ライブラリresolvを使って、ホスト名の名前解決を行います。 require 'resolv' puts Resolv.getaddress("d.hatena.ne.jp") Resolv.each_address("www.yahoo.co.jp") do |ip| puts ip end

Ripper

疑問:Ripperを使ってみようと思いました。refe ripperでは見つかるけれど、requre 'ripper'ではno such file to load -- ripper (LoadError)というエラーがでます。ruby -v は ruby 1.8.4 (2005-12-24) [i386-mswin32] 追記:なかむら(う)さんから「Ripper…

strip

String#stripで前後の空白を削除できます(元の文字列はそのままで、削除した新しい文字列を返します)。 [ "left ", " right", " center ", "\ttab\r\n", "\nnewline", "\rcr lf\n", ].each do |s| p s.strip end実行結果です。 "left" "right" "center" "t…

Bindingと継続の類似性

bindingで作った「もし再帰の深みで評価したら」のサンプルを見ていて、「《Binding》って《継続》と似ているところがあるのでは?」と思いました。その「似ている」感じを表現するため、サンプルを作ってみました。 $env = Array.new def factorial(n) f = …

binding

Kernel#bindingを使ってBindingオブジェクトを得ると、「環境」(評価を行うためのコンテキスト情報)を得ることができます。evalの第二引数にBindingオブジェクトを渡すと、その環境を用いて式を評価することができます。 ri Bindingの解説によれば、Kernel…

alias

id:walf443さんの記事を読んでいて、「alias は構文なのでメソッドの中では使えない」というrefeの記述を見ました。へえ…と思って試します。 def rubyco puts "rubyco" end def change(x) if x alias org_rubyco rubyco end end change(false) org_rubyco #=…