2006-02-01から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") …

String#squeeze

Rubyでtrをするようなものですね。 p "Google".squeeze #=> "Gogle" p "Yahoo!".squeeze #=> "Yaho!"ところで、refeでは、refe s squeezeでString#squeezeを表示してくれるのがうれしいです。

YARV

最近あちこちでYARVという単語を見かけます。Google先生に尋ねてみたら、世界最速のRuby仮想マシンを作るプロジェクトということがわかりました。 Google: YARV YARV: Yet Another Ruby VM

net/http, open-uri

Webページを取得する簡単な方法。 require "net/http" response, content = Net::HTTP.new("www.google.co.jp", 80).get("/", nil) puts response puts contentid:walf443さんから、open-uriを用いる方法を教えていただきました。open-uriを使うと、ファイル…

MutexとConditionVariable

RubyのMutexとConditionVariableを使ってProducer-Consumerを作ってみました。ブロックするキューBlockingQueueクラスです。 Mutexクラスはリエントラントではないのでちょっと注意が必要でした。 require 'thread' class BlockingQueue def initialize @que…

wcを作る

Rubyでwcを作ってみました。 files = 0 total_lines = total_words = total_chars = 0 ARGV.each do |pattern| Dir.glob(pattern) do |file| open(file, "r") do |f| f.binmode files += 1 lines = words = chars = 0 while line = f.gets lines += 1 chars …

1/0と1/0.0

Rubyで1/0はZeroDivisionErrorになるけれど、1/0.0はInfinityになります。 begin p 1/0 rescue => e p e #=> #<ZeroDivisionError: divided by 0> end begin p 1/0.0 #=> Infinity rescue => e p e end</zerodivisionerror:>

String#[]

Rubyの文字列で、[]を使うと文字コードが得られます。範囲外ならnilになり、負の場合には末尾からになります。 s = "ABC" p s[0] #=> 65 p s[1] #=> 66 p s[2] #=> 67 p s[3] #=> nil p s[4] #=> nil p s[-1] #=> 67 p s[-2] #=> 66 p s[-3] #=> 65 p s[-4] …

artonさん

あーとんさんに見つかりリンクしていただきました。あー、とんでもないことに♪などと意味のない語呂合わせ。

One-Click Installer

今日は、One-Click InstallerでRubyを入れてみようと思います。 昨日インストールしたActiveScriptRubyをいったんアンインストールしました。msiは残してあるからいつでも復帰できます。 One-Click Installer - Windowsから、ruby184-16p3.exeというのを選び…

String#scan

scanはイテレータをとることができます。 s = "12,345?67-890" s.scan(/(\d+)/) do |n| puts n end __END__ 12 345 67 890

Gems版ReFe

id:ha-tanさんからGems版のReFeだったらもう少し楽にインストールできますよというアドバイスをいただきました。Gemsというのは、以前Ruby on Railsを一瞬だけ試したときにインストールした(そしてすぐ消した)記憶があります。「Gems版のReFeには、ReFeで…

Gems版ReFe(2)

rubygems-0.8.11をすでに展開していたので、ruby setup.rb installしようとしたら、zlib.dllがないよと言われて落ちてしまいました。あれれ。

WindowsでRuby

WindowsでRubyをする人って、以下のどれを使うのがよいのでしょうね。Microsoft Windows版のビルト環境による違いを調べるのが正しい態度のようですが。 Ruby-mswin32 cygwin, djgpp, mingw, mswin32 ActiveScriptRuby まあ、いろいろやってみましょう。 追…

Gems版ReFe(3)

ActiveScriptRubyにしたら、rubygems-0.8.11でruby setup.rb installがうまくいきました。これからGems版ReFeを入れてみます。 http://rubyforge.org/frs/?group_id=1029 から refe-0.8.0.2.gem をダウンロード。 gem install refe-0.8.0.2.gem を実行。 > g…

refe ARGF, refe ARGV

refe ARGFだとARGFの説明が表示されてよい感じなのですが、なぜか、refe ARGVだと説明が出てきません。not match: ARGVと言われてしまいます。 追記: id:ha-tanさんから「Gems版ReFe-0.8.0.3リリースしました」というトラックバックをいただきました。ありが…

Gems版ReFeインストールのまとめ

以下の手順でインストールができました。 1. ActiveScriptRubyをインストール 2. rubygems-0.8.11(すでに入手、展開していた)の下で、 ruby setup.rb config ruby setup.rb setup ruby setup.rb install 3. refe-0.8.0.2.gemをダウンロード 4. gem install…

FirstStepRuby

るびまの常設記事にFirstStepRubyというのがありました。参考になります。

リファレンスマニュアル整備について

るびま13号の巻頭言に「リファレンスマニュアル整備について」として、高橋征義さんが詳細に書いていらした。うーん、すごいです…。何とも頭が下がります。

Test::Unit::TestCase(1)

見よう見まね。 require "test/unit" class RubycoTest < Test::Unit::TestCase def test_rubyco testval = "Respected" assert_equal "Expected", testval, "Simple string test." end def test_rubycoadd z = 3 + 4 assert_equal 6, z, "Simple '+' test."…