(Ruby)Rubyはじめました.Procについて.
前置き
しばらくNodeを勉強していたけど気持ちにやや停滞感があり,Rubyはじめました,というより,一度クローラを作ってみたいと思っていて,書籍「Rubyによるクローラー開発技法」を手に取りました.
数ページ進んで「これはNodeでやるべきじゃないのか?」と思ったりしました.jQuery的なことをNode上で行うモジュールもあるようでした.しかし,ブラウザでいうところの「querySelector」的なものは見つけられずだったし,documentオブジェクト的なのもどうするのだろうとかも思ったし,話題のVirtualDOMとか使えるのかとかちょっとまったくわからなかったので.
そもそものそもそもの停滞感ってのが,やっぱりサーバサイドでNodeはまだ考えられないよねっていうところがあって.(Validatorぐらいはやってみたい!)(もちろんNodeはブラウザなしで開発できる魅力が一番です!)
なのでやっぱり先述の書籍で,Rubyでやっていこうと決めた次第です.
Rubyは美しい
前置きが長くなりました.
Rubyをかじったことがあったのですが,しばらくNodeで高階関数とかコールバックとかやってきたおかげで,Rubyのプログラムコードの見方が大いに違いました.
特にブロックが好きで,仮引数のリストをパイプ(|)で挟むのは今まで見てきた言語と違い非常に見やすく感じます.
open('samplepage.html', &:read) ???
表題のProcについてですが,下記のコードがちょっとよくわからなかったので少しだけ調べました.
open('samplepage.html', &:read)
何をしているかというと,ファイルを開いて read に何か(ファイルポインタ?)を渡しているのだというのは雰囲気でわかります.
書籍本文を読むと read は File.read であるとのこと.なるほど.
ということで調べてみた.試してみた.わかった.
puts '(1) block ----- 通常のブロック' array = [1, 2, 3, 4, 5] array.each do |x| puts x end proc = Proc.new do |x| puts x end puts '(2) array1 each &proc ----- Procを使ってブロックを使いまわす(1)' array1 = [1, 2, 3, 4, 5] array1.each &proc puts '(3) array2 each &proc ----- Procを使ってブロックを使いまわす(2)' array2 = [6, 7, 8, 9, 0] array2.each &proc puts '(4) array3 each &:My#sayLength ----- クラスのメソッドを呼ぶようにする' class My def initialize(no) @no = no end def sayLength p "I an No,#{@no}, length is #{@no.length} !" end end array3 = [My.new('1'), My.new('20'), My.new('300')] array3.each &:sayLength
(1) block ----- 通常のブロック 1 2 3 4 5 (2) array1 each &proc ----- Procを使ってブロックを使いまわす(1) 1 2 3 4 5 (3) array2 each &proc ----- Procを使ってブロックを使いまわす(2) 6 7 8 9 0 (4) array3 each &:My#sayLength ----- クラスのメソッドを呼ぶようにする "I an No,1, length is 1 !" "I an No,20, length is 2 !" "I an No,300, length is 3 !"
とういうわけで,書籍の使い方はサンプルコードの (4) の使い方をしているのです.& と : を組み合わせて使用しているのは,シンタックスシュガーなのか苦いのかわからないけど,ちょっとトリッキーだなあ.