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

each_key

Rubyのハッシュでキーに関してイテレートするときには、keys.eachまたはeach_keyを使います。 h = { "Alice" => 31, "Bobby" => 41, "Chris" => 59, } h.keys.each {|k| puts "#{k} => #{h[k]}" } h.each_key {|k| puts "#{k} => #{h[k]}" }

||=

Rubyで、「xがnilだったら10を代入する」というイディオムです。以前にも書いたような気がしますが、気にしないことにします。 x ||= 10 puts x

CGI.escapeHTML

既存のクラスにさくっとメソッド追加できるのは、Rubyの非常によい点だと思います。 require "cgi" class String def escapeHTML CGI.escapeHTML(self) end end puts "<Hello & Goodbye>".escapeHTML #=> &lt;Hello &amp; Goodbye&gt;</hello>

クラス定義は動的

Rubyでは、クラス定義は動的です。ですから、実行時にクラス定義を切り替えることができます。 print "Choose 1 or 2: " (answer = gets).chomp! if answer == "1" class Rubyco def hello puts "Hello, one!" end end else class Rubyco def hello puts "He…

今日で3週間

「ほほえみつつ、Ruby。」をキャッチフレーズにしてRubyの勉強を続けています。早いもので、今日で21日目、3週間が過ぎたことになります。 Webで公開されているソースを見ても、ちゃんと中身を読むようになりましたし、@や { ... } の心もつかめてきたように…

Moduleクラス

Moduleクラスを読んでいると「RubyインタプリタはRubyで書きやすそう」と思いました。LispインタプリタをLispで書きやすいように。 構文がLispになっているRuby処理系はどなたか作っていらっしゃらないでしょうかねえ…。

すべてが実行文

Module#attr自体もメソッドなのですね。attrを宣言だと思うと分かりにくいのですが、メソッド呼び出しだと思うととても理解しやすくなります。

privateメソッド

Rubyでは、private, publicはModuleのメソッドです。 普段はpublicもprivateも、privateメソッドになっているので、無理やりpublicメソッドにしてみました。 publicになったprivateメソッドを使って、helloメソッドをprivateメソッドにしました。 class Ruby…

単項演算子の+と-

Rubyの単項演算子の+と-は、それぞれ+@および-@というメソッドになります。 class Coin def initialize(head=true) @head = head end def to_s @head ? "head" : "tail" end def +@ Coin.new(@head) end def -@ Coin.new(!@head) end end c = Coin.new puts …

Module#ancestors

ancestorsは、スーパークラスたちを得ます。 p 0 #=> 0 p 0.class #=> Fixnum p 0.class.ancestors #=> [Fixnum, Integer, Precision, Numeric, Comparable, Object, Kernel] p 0.class.ancestors[-1] #=> Kernel

特異メソッド

Rubyでは、オブジェクト固有のメソッドを定義できます。特異メソッドです。 s = "Rubyco" def s.hello puts "Hello" end s.hello #=> Hello t = s t.hello #=> Hello "Rubyco".hello #=> undefined method `hello' for "Rubyco":String (NoMethodError)

elseとensure

Rubyの例外処理で、elseはrescueしなかった場合だけ実行します。ensureはrescueしてもしなくても実行します。 for i in 1..3 begin puts "i = #{i}" if i == 1 raise SystemCallError, "one"; elsif i == 2 raise StandardError, "two"; end rescue SystemCa…

配列の&

Rubyでは、配列の&は集合の積になります。 a = ['a', 'b', 'c', 'c', 'd', 'e'] b = [ 'b', 'b', 'c', 'c', 'e', 'a'] p a & b #=> ["a", "b", "c", "e"] p b & a #=> ["b", "c", "e", "a"]

Hikiを読む(3)

Rubyで書かれたWikiエンジン、Hikiを読んでみます。今回は動かしながら研究します。 まず、動かしました。 Windowsで/usr/bin/envがなかったのでちょっと手間取ったけれど、動きました。 .htaccessで、設定ファイルを個別にdeny from allしています。なるほ…

CGIを作る

以前Perlで書いた簡単なメモ書きCGIをRubyに移植して動かしました。 まだ関数ベースで(大きなクラスに全メソッドを入れて)書いているので、OOっぽくありません。それは今後の課題です。

loadとrequire

Rubyで別のファイルを取り込むとき、loadはファイル名を指定して何度でも読み込まれ、requireはライブラリ名(またはファイル名)を指定して1度だけ読みます。 まず、now.rbというファイルを用意します。 $now = Time.newそして、以下のプログラムを動かします…

open, binmode, seek, getc, putc

RubyのFileを使って配列もどきを作りました。あ、でもcloseしていませんね。 書き込むときは自動的に一文字目がかかれるのに、読み出すときは明示的にchrを取らないと文字列になりません。 class FileArray def initialize(filename) @file = File.open(file…

予約語をメソッドに

Rubyでは、defの後は必ずメソッドなので、classという名前のメソッドも作れるようです。 class Rubyco def class puts "Hello!" end end Rubyco.new.class #=> Hello!こんなにひどい(?)こともできます。 class Rubyco def def puts "Hello!" end def end sel…

include

Rubyのincludeでモジュールをインクルードするのは、リファレンスを作り出すだけです。モジュールのメソッドを再定義すれば、includeしたクラスの振る舞いも変わります。 module Message def greeting "Good morning." end end class Rubyco include Message…

Comparable

Comparableをincludeしてメソッドをdefすると、比較演算子が使えます。 class Value include Comparable attr_reader :value def initialize(v=0) @value = case v when 0 then 0 when 1 then 1 else 2 end end def <=>(a) @value <=> a.value end end zero …

ARGV

コマンドライン引数を表示します。 puts ARGV puts ARGV.class実行結果です。 > ruby a.rb 111 222 333 111 222 333 Array

rand

コマンドラインからmaxが与えられなかったら0...100の範囲の乱数を表示します。 「コマンドラインから与えられなかったら」にはもっとよいイディオムがありそうですね。 ARGV << 100 if ARGV.length == 0 puts rand(ARGV[0])

File.open

毎回ファイルをオープンして追記するというLogクラスを作ってみました。 型がないというのは何だか一種すがすがしいものがありますね。 class Log def initialize(filename) @filename = filename end def puts(o) File.open(@filename, "a") do |f| f.puts(…

RubyでSQLite3の練習

SQLite downloadからPrecompiled Binaries For Windowsをダウンロードして展開 sqlite-3_3_3.zip (sqlite3.exe) sqlitedll-3_3_3.zip (sqlite3.dll, sqlite3.def) SQLite documentationのGetting Startedを読んで練習 SQLite/Ruby経由でsqlite3-rubyをダウン…

Hikiを読む(2)

Rubyで書かれたWikiエンジン、Hikiを読んでみます。 hiki/command.rb def cmd_save @db.delete( page )で削除。 @dbの元になるdbは、Command.newで渡されてきます。 hiki/hikidb.rb...というファイルはないんですね。 hiki/config.rb require "hiki/db/#{@da…

Hikiを読む(1)

Rubyで書かれたWikiエンジン、Hikiを読んでみます。 hiki.cgi $defout.binmodeはきっとデフォルトのIO(出力の方)をbinmodeにするのでしょう。 ri __FILE__ってやっても教えてくれないんですね。 いつも気になるのですが、Hiki::HikiDB::new( conf )と、Hiki:…

ARGF

RubyでARGFは、コマンドライン引数で与えられたファイル名を仮想的に連結したIOオブジェクトになります。ファイルが指定されないときはARGFはSTDINになるようです。 まず、a.rbです。 while line = ARGF.gets line.chomp! if /^>(.*)/ =~ line caption = $1 …

BEGINとEND

RubyのBEGINとENDはPerlのものと同じですね。 BEGIN { puts "BEGIN" } END { puts "END" } begin puts "begin" exit rescue SystemExit puts "rescue" ensure puts "ensure" end実行結果です。 BEGIN begin rescue ensure END

Regexpの一部にオプション

Rubyでは、正規表現の一部分だけにオプションを適用することができます。 以下のプログラムでは、Cという部分だけに大文字小文字の違いを無視するオプションiを適用しています。 s = "abcdef" /ab(?i:C)def/ =~ s p $& #=> "abcdef"

正規表現練習(リンク生成)

簡単なHTMLのリンクを生成するプログラムを書いてみました。 while line = DATA.gets line.chomp! if /^>(.*)/ =~ line caption = $1 elsif caption puts %Q{<a href="#{line}">#{caption}</a>\n} caption = nil else puts line end end __END__ Hello, I am rubyco. Visit >Rubyco…