(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) の使い方をしているのです.& と : を組み合わせて使用しているのは,シンタックスシュガーなのか苦いのかわからないけど,ちょっとトリッキーだなあ.