2006-02-28から1日間の記事一覧

MonitorMixin

RubyのMonitorMixinを使った版のProducer-Consumerです。Mutexを直接使ったものよりも見通しはよい…でしょうか。 require 'monitor' class BlockingQueue def initialize @queue = [] @queue.extend MonitorMixin @cv = @queue.new_cond end def enqueue(e) …

整数部3桁ごとにコンマを入れる

s = "1234567890.12345" 1 while s.gsub!(/^(\d*\d)(\d\d\d)/, "\\1,\\2") puts s #=> 1,234,567,890.12345

block_given?

Rubyのメソッドの中で、ブロック(イテレータ)が与えられているかどうかを調べるときにはblock_given?が使えます。 def my_each(*arg) if block_given? arg.each do |a| yield(a) end else arg end end my_each(1,2,3) do |f| p f end p my_each(1,2,3) #=>…

メインスレッド

Rubyはメインスレッドが終了するとほかにスレッドが動いていてもプログラム全体が終了します。ちょっとこわいのですが、これはこういうものだとわかっていれば特に問題はない…のかな。

ハッシュとブロック

Rubyでハッシュをメソッドに引数として与えようとすると、ブロックと誤解されることがあります。カッコを使うと誤解を解くことができます。 def print_hash(hash) hash.each_pair do |key, value| puts "#{key} => #{value}" end end # print_hash { "Alice"…

nil.class

nilはヌルポインタではなく、オブジェクトです。 p nil.class #=> NilClass

do ... end

最近、{ ... } よりも do ... end のほうがしっくりくるようになってきました。その理由は、ブロックパラメータの書き方にあるかも。 たとえば、 method do |x, y| ... endなどしっくりなじむのだが、 method { |x, y| ... }あるいは method {|x, y| ... }だ…

File.split

RubyのFile.splitを使うと、パス名とファイル名を分けられます。 dir, file = File.split('/usr/bin/ruby') puts dir #=> /usr/bin puts file #=> ruby dir, file = File.split("C:\\Program Files\\Theorem Solver\\Fermat.exe") puts dir #=> C:\Program F…

nil != false

nilは偽になりますが、nil == falseではありません。 if nil == false puts "nil == false" else puts "nil != false" #=> nil != false endでも、無理矢理nilの==を再定義してしまうと、nil == falseになってしまいます。…どこかで矛盾が起きるかもしれませ…

フィボナッチ数列

フィボナッチ数列。だんだん遅くなります。あとでMemoiseを試します。 def fib(n) if n <= 1 1 else fib(n-1) + fib(n-2) end end (0..20).each do |n| puts fib(n) end

kind_of?

Rubyのkind_of?またはis_a?を使うと、オブジェクトの種類を弁別できます。オーバーロード代わり(←言い過ぎ)。 def exclam(o) if o.kind_of?(String) o << "!" else o.kind_of?(Integer) v = 1 o.downto(1) do |n| v *= n end v end end p exclam("Hello") …