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

send

Object#sendメソッドは、メソッド呼び出しを行うメソッドです。 class Rubyco def self.hello(name) puts "Hello #{name}!" end end Rubyco.hello('Alice') #=> Hello Alice! Rubyco.send(:hello, 'Alice') #=> Hello Alice!

Pathname

Pathnameというクラスはとても便利なファサード(Facade)らしいです。 Pathname Pathname - ファイル名のグッドラッパー もっとPathname。 疑問:上で紹介されていた http://redhanded.hobix.com/bits/howPowerfulPathnameIs.html というページがNot Foundで…

method_added

Module#method_addedは、そのモジュールに対するメソッド定義時にコールバックされます。 method_added自身を定義する場所は重要です。 class Rubyco def yahoo puts "Yahoo!" end def self.method_added(symbol) puts "method_added(#{symbol})" end def he…

FEEDBRINGER

「FEEDBRINGER.netというサイトで、この「rubyco(るびこ)の日記」が日間・週間・月間の人気フィードになっている」と教えていただきました。見てみますと、日間1位・週間1位・月間2位になっていました。FEEDBRINGERにはRubyistが多いのかもしれませんね。 み…

人工知能もどき

知識を与えて、簡単な推論を行うプログラムをRubyで書いてみました。 実行結果を先に示します。 与えられた知識は次の通り: 「ソクラテス」は「人間」である。 「ミドリムシ」は「動物」である。 「ミドリムシ」は「葉緑素を持っている存在」である。 「人…

SystemStackError

疑問:どうして以下のプログラムを動かしたとき、"*"が一個も表示されずにプログラムが終了するのでしょうか。 追記:id:walf443さんから、「Rubyのインタプリタそのものが死んでしまっているからじゃないでしょうか?irbでやってみたらirbがお亡くなりにな…

Kernel#y

pの出力のように、yでYAMLな出力ができるそうです。 > ri y -------------------------------------------------------------------------------- Kernel#y y( object, *objects ) -----------------------------------------------------------------------…

Infinity, NaN

0.0による割り算でInfinity, -Infinity, NaNが作れます。NaNにはマイナスはありません。整数0による割り算ではZeroDivisionErrorがraiseされます。 p +1/0.0 #=> Infinity p -1/0.0 #=> -Infinity p +0/0.0 #=> NaN p -0/0.0 #=> NaN p +1/0 #=> in `/': div…

raiseクイズ

以下のRubyプログラムを動かしたら、どんな文字列がどんなスピードで表示されるでしょう、というのが問題です。まずは頭で想像してから動かしてくださいね♪ def dive(n) raise if n < 0 begin dive(n - 1) rescue ensure dive(n - 1) end end (1..100).each …

コマンド実行

Rubyで、シェルを起動してコマンドを実行するときには `...` を使います。戻り値は標準出力に出した文字列です。 p `echo Hello` #=> "Hello\n"`...`を調べるときには、 ri ` のようにします。メソッドは、Kernel#`です。 以下のプログラム(a.rb)を動かすと…

相互参照requireクイズ

10分ほど悩んだ現象をクイズにしました。 one.rb, two.rbというファイルがあるとしましょう。 # one.rb require "two" puts "one"# two.rb require "one" puts "two"ここで、ruby one.rbを実行すると、その結果は以下のようになります。 one two oneええっ……

rjust, ljust

rjust, ljustでは、文字列を右寄せ、左寄せにします。 p "Rubyco".rjust(40) p "Rubyco".rjust(40, ".") p "Rubyco".ljust(40) p "Rubyco".ljust(40, ".")実行結果です。 " Rubyco" "..................................Rubyco" "Rubyco " "Rubyco..........…

PI

Mathモジュールをincludeすると、PIが直接使えます。 include Math p PI #=> 3.14159265358979

constants, const_get

Module#constantsで定数の一覧が得られ、Module#const_getで実際の値が得られます。 p Math.constants p Math.const_get("PI") Math.constants.sort.each do |c| puts "#{c} = #{Math.const_get(c)}" end実行結果です。 ["E", "PI"] 3.14159265358979 E = 2.…

Exception

Rubyで、すべてのExceptionをraiseするプログラムを作りました。 Object.constants.sort.each do |c| begin o = Object.const_get(c) if o.class == Class && o < Exception puts "#{o}" raise o end rescue Exception => e end endException =>の部分を指定…

全クラスの階層を表示

ObjectSpaceを使って、全クラスの階層を表示するプログラムを作りました。 subclass = Hash.new ObjectSpace.each_object(Class) do |c| subclass[c.superclass.to_s] ||= Array.new subclass[c.superclass.to_s] << c.to_s end visit = proc { |cname, inde…

引数としてブロックを渡す

Rubyでは、&で修飾した引数を最後に渡して、メソッドにブロックを明示的に渡すことができます。 以下の例は、一つめはブロック付きのメソッド呼び出し、二つめは引数にブロックを渡したもの、三つめはその両方をやろうとしてエラーになるものです。 def ruby…

to_proc

Procオブジェクトでなくても、to_procメソッドを持っているオブジェクトなら、&で修飾した引数としてメソッドに渡すことができます。 class Rubyco def to_proc proc { puts "Hello" } end end def rubyco(&block) block.call end rubyco(&Rubyco.new) #=> H…

UTF8にマッチする正規表現

たつをさんのUTF-8の文字にマッチする正規表現を読んで、なるほどと思いつつ「ビットパターンから生成することもできるのでは?」と感じました。 そこでRubyで書いてみました。こんな風に。 rs = Array.new [ "0xxxxxxx", "110xxxxx 10xxxxxx", "1110xxxx 10…

Procと変数

Procオブジェクトはコンテキストを保持します。 ですから、外部でローカル変数が書き換えられると、Procオブジェクトの中で参照していた変数の値も変化します。 n = 123 p = proc { puts n } p.call #=> 123 n = 456 p.call #=> 456 def rubyco(p, n) p.call…

文字列リテラルとobject_id

Rubyの文字列リテラルは、評価するたびに新しいオブジェクトが作られます。 object_idを調べればそのことが確認できます。 a = 'hello' b = 'hello' c = 'hello' p a.object_id p b.object_id p c.object_id 3.times do p 'hello'.object_id end実行結果です…

SystemStackError

Rubyで無限に深いメソッド呼び出しをすると、SystemStackErrorになります。 def rubyco rubyco end rubyco実行すると、次のようになります。 a.rb:2:in `rubyco': stack level too deep (SystemStackError) from a.rb:2:in `rubyco' from a.rb:4ところで、二…

線形合同法

am

線形合同法による疑似乱数生成器をRubyで書きました。 class LinearCongruentialRandom A = 1812433253 def initialize(seed=314159) @state = seed end def next(max) @state = A * @state + 1 @state % max.to_i.abs end end r = LinearCongruentialRandom…

かき混ぜ法

am

M. D. MacLarenとG. Marsagliaによって提案された、擬似乱数アルゴリズムを「改良」する(と言われている)「かき混ぜ法」です。 課題:maxの扱い 課題:インタフェースを定め、Decoratorパターンに。 class LinearCongruentialRandom A = 1812433253 def in…

asctime, ctime

Time#asctime, Time#ctimeはTimeオブジェクトの文字列表現を返します。Cライブラリのasctimeと違い、末尾の改行はありません。 p Time.now.asctime #=> "Fri Mar 10 19:03:54 2006" p Time.now.ctime #=> "Fri Mar 10 19:03:54 2006"

getutc

Time#getutcはTimeオブジェクトをUTCに変換した新しいTimeオブジェクトを得ます。 p Time.now.asctime #=> "Fri Mar 10 19:06:20 2006" p Time.now.getutc.asctime #=> "Fri Mar 10 10:06:20 2006"

Struct

Structクラスを使って、構造体クラスを作ることができます。 構造体クラスには自動的にアクセサが作られます。 以下のプログラムでは、Peopleというクラスを作っています。 People = Struct.new('People', :name, :age, :mail) alice = People.new('Alice', …

PI

Math::PIは円周率の近似値です。 p Math::PI #=> 3.14159265358979

円を描く

キャラクタで円を描きます。 def print_circle(r, on='*', off=' ') (-r..+r).each do |y| (-r..+r).each do |x| print x ** 2 + y ** 2 <= r ** 2 ? on : off end print "\n" end end print_circle(10, '●', '○')実行結果です。 ○○○○○○○○○○●○○○○○○○○○○ ○○○○…

『プログラミングRuby 第2版』

Dave Thomas + Chad Fowler + Andy Hunt著、田和勝 + まつもとゆきひろ訳だそうです。楽しみです。 『プログラミングRuby 第2版 言語編』 『プログラミングRuby 第2版 ライブラリ編』