Ruby

継続渡しスタイル

rubyの場合は継続の受け渡しにブロック構文を使うといい感じに書けるんだな。 同じく階乗の例。 def fact(n) n==0 ? yield(1) : fact(n-1){|r|yield(n*r)} end fact(4){|r|puts r}

dllを呼び出す

今作ったfoo.dllをRubyから呼び出してみる require 'dl/win32' puts Win32API.new('foo.dll','foo','i','i').call(1) s='Fizz' Win32API.new('foo.dll','bar','p').call(s) puts s実行結果 2 Buzzこっちはちゃんとsの内容が書き換わった。

1.9のProc

今まではこう書いてた foo = proc{|x,y|x+y}1.9からはこう書ける foo = ->(x,y){x+y}ちなみにこうではないので注意 foo = ->{|x,y|x+y}呼び出す方も今まではこう書いてた foo.call(1,2)1.9からはこう書ける foo.(1,2)こうも書ける foo[1,2]しかしこうは出来…

1.9とJSON

すばらしい。ruby1.9のHashはJSON風にも書けるようになってた。 ハッシュ生成は多くの場合以下のようなリテラル(ハッシュ式)で行われます。 {a => b, ... } #aはキー、bは値となる {s: b , ... } #{ :s => b, ... } と同じ。キーがシンボルの場合の省略した…

バージョン1.9.0

Ruby1.9.0が出たのでちょっと試してみた。 クロージャ irb> RUBY_VERSION => "1.9.0" irb> x = 100 => 100 irb> makeplus = lambda{|x| lambda{|y| x+y }} => #<Proc...> irb> plus1 = makeplus.call(1) => #<Proc...> irb> x => 100 #今まではここで x が 1 になってた。 irb></proc...></proc...>…

出力を捨てる

$stdout=StringIO.newとすると不要なバッファリングをしてしまう。 $stdout=open('/dev/null','w')とするとOS依存になってしまう。 $stdout, $stderr に設定されるオブジェクトには write という名の メソッドが定義されている必要があります。 http://www.r…

guessメソッド

欲しいメソッドを推測するguessというメソッドを作ってみた。 使い方 元の値.guess(目的の値,引数…) irb> require 'guess' => true irb> 1.guess 2 ← 1から2になるメソッドを探す => ["next", "succ"] irb> [1,2,3].guess 3 ← [1,2,3]から3を返すメソッドを…

配列のシャッフル

irb> (0..9).sort_by{rand} => [2, 3, 4, 5, 7, 8, 9, 1, 0, 6]これはうまい。感動した。 http://d.hatena.ne.jp/dropdb/20071109/1194535114

未定義値

|matz> いや、私もです。諸般の事情でnilとfalseを分離したときには相当 |matz> 気持ち悪かったです。今思えば、しょうがなかったと思うけど。 | |nil と false を分離した事情ってどういう物だったんですか?今回話題にもなっているHashの未定義値とのから…

行列計算

matrix.rbの逆行列計算ってなんかおかしくね? irb(main):001:0> require 'matrix' => true irb(main):002:0> Matrix[[2,1],[3,1]].inv ExceptionForMatrix::ErrNotRegular: Not Regular Matrix from /usr/lib/ruby/1.8/matrix.rb:595:in `inverse_from' fro…

each_with_indexの実装を探す

まず、/usr/lib/ruby/1.8の中を見てみる。 % find /usr/lib/ruby/1.8 -name '*numerable*' -print特にEnumerable.rbってファイルはない。 よく考えたら、require 'Enumerable'ってやるわけじゃなくて、include Enumerableってやってるんだった。 そもそも定…

main

rubyのトップレベル(?)のselfはmainというオブジェクトだった。 % ruby -e 'p self' mainirbでも同じmainになってる。 なんかのクラスのインスタンスってわけじゃなくて素のObjectなようだ。 % irb irb(main):001:0> self => main irb(main):002:0> self.…

全ASCII文字を列挙

これも教えてもらった。 % ruby -e '" ".upto("~"){|s|puts s}'→訂正:出力結果を確認してなかった。これも下と同じで9で止まってしまう。uptoはブロックが必須。返値は自分のみ。 > " ".upto("~").to_a LocalJumpError: no block given > " ".upto("~"){|s|…

マルチバイト文字列の長さ

% ruby -Ku -e 'puts "あいう".length' 9 % ruby -Ku -rjcode -e 'puts "あいう".jlength' 3 % ruby -Ku -e 'puts "あいう".split("").length' 3覚書: $KCODE の影響はほとんどの場合 String よりも Regexp に対して。 「Shift_JIS の 2 バイト目に \ が含ま…

WWW::Mechanize

これはいい。今までjavascriptでやろうとすると阻まれていたドメイン越えのブラウザ操作がこれで出来る。Rubyでウェブサイトのアクセスを自動化するライブラリ「WWW::Mechanize」の日本語リファレンスです。javascriptの処理が入っていてもついてこれるか?…