ぞえの技術めも

Ruby on Rails勉強中

【23日目】【1日20分のRailsチュートリアル】ブロックというRubyの強力な機能

Ruby on Railsチュートリアル(第3版)

今日は「4.3.2 ブロック」から。

4.3.2 ブロック

配列と範囲はいずれも、ブロックを伴うさまざまなメソッドに対して応答することができます。ブロックは、Rubyの極めて強力な機能であり、かつわかりにくい機能でもあります。

分かりにくいのかー…。

>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5

{ |i| puts 2 * i }がブロックらしい。
うーん、C言語で書くとこんな感じだよね。。。

for (i = 1; i <= 5; i++) {
    printf("%d", i*2);
}

ブロックであることを示すには波かっこ { } で囲みますが、以下のようにdoとendで囲んで示すこともできます。

波かっこの方が馴染みがあるけどどっちが読みやすいんだろう。

>> (1..5).each do |i|
?> puts 2 * i
>> end
2
4
6
8
10
=> 1..5

RailsチュートリアルではRuby共通の慣習に従って、短い1行のブロックには波かっこを使用し、長い1行や複数行のブロックにはdo..end記法を使用しています。

と思ってたら使い方の方針の説明あった。
長い場合はdo...end記法か。

ブロックは見た目よりもずっと奥が深く、ブロックを十分に理解するためには相当なプログラミング経験が必要です。
そのためには、ブロックを含むコードをたくさん読みこなすことでブロックの本質を会得する以外に方法はありません。

一朝一夕では駄目ってことね。慣れますか。

紹介されている書き方を見てみる。

>> 3.times { puts "Betelgeuse!" }   # 3.timesではブロックに変数を使用していない
Betelgeuse!
Betelgeuse!
Betelgeuse!
=> 3

timesは指定した回数繰り返すメソッドかな。

mapeachの違いって何
って思って実行してみたら返り値が違った。

>> (1..5).map { |i| i**2 }          # 「**」記法は冪乗 (べき乗) 
=> [1, 4, 9, 16, 25]
>> (1..5).each { |i| i**2 }          # 「**」記法は冪乗 (べき乗)                                                                                             
=> 1..5

mapの方は配列を返すらしい。

このエントリでなんとなく理解した。

manji602.hatenablog.com

次は配列作成と大文字小文字変換。
返り値まで見たら何をするメソッドなのか分かるけどパッと理解できるようになるには慣れが必要かなー。

>> %w[a b c]                        # %w で文字列の配列を作成
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]

ところで、1.5.4でランダムなサブドメインを生成するために以下のRubyコードを紹介しましたが、このコードを理解するための準備が整ったので、今こそ読み解いてみましょう。

意味が分からなかったのでスルーしてたコードがここで解説された。

('a'..'z').to_a.shuffle[0..7].join

最初範囲とかさっぱりで頭の('a'..'z')も何を意味しているのか分からなかったけど1つずつ紐解いていけば理解はできた。

今日の作業時間は【31分】

次は「4.3.3 ハッシュとシンボル」から。