第4章 Rails風味のRuby


4.1 動機

■ヘルパー
view内でちょっとした処理をやりたい時に呼び出すもの。
実体はmodule。app/helpersで定義する。
使いたいとき<%= 〜%>で呼び出す。

■組み込みヘルパー
ある動作を処理する場合にメソッド化して扱えるようにRailsにあらかじめ組み込まれた機能。
helpersで定義しなくても使える。

4.2 文字列とメソッド

【演習】
1.city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。
city = "Yokohama"
prefecture = "Kanagawa"

2.先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
puts prefecture+"県" + city + "市"

3.上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)
やってみて

4.タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?
やってみて

■オブジェクト
Rubyでは、あらゆるものがオブジェクト。
1.アイデンティティを持っている
2.メッセージを受け取る
3.内部状態を持つ
オブジェクトとは (いついかなる場合にも) メッセージに応答するものです。

文字列に質問を尋ねることができて、文字列がその質問に答えてくれる。
「empty?」という質問(メソッド)を投げかけるとその文字列が空なのか答えてくれる。

■メソッドチェーン
「nil.to_s.empty?」みたいな感じでto_sとemptyの2つをつなげる。

【演習】
1."racecar" の文字列の長さはいくつですか? lengthメソッドを使って調べてみてください。
racecar.length

2.reverseメソッドを使って、"racecar"の文字列を逆から読むとどうなるか調べてみてください。
racecar.reverse

3.変数sに "racecar" を代入してください。その後、比較演算子 (==) を使って変数sとs.reverseの値が同じであるかどうか、調べてみてください。
s=racecar
s == s.reverse

4.リスト 4.9を実行すると、どんな結果になるでしょうか? 変数sに "onomatopoeia" という文字列を代入するとどうなるでしょうか? ヒント: 上矢印 (またはCtrl-Pコマンド) を使って以前に使ったコマンドを再利用すると一からコマンドを全部打ち込む必要がなくて便利ですよ。)
puts "It's a palindrome!" if s == s.reverse
s="onomatopoeia"
puts "It's a palindrome!" if s == s.reverse

【演習】
1.リスト 4.10のFILL_INの部分を適切なコードに置き換え、回文かどうかをチェックするメソッドを定義してみてください。ヒント: リスト 4.9の比較方法を参考にしてください。
if s==s.reverse

2.上で定義したメソッドを使って “racecar” と “onomatopoeia” が回文かどうかを確かめてみてください。1つ目は回文である、2つ目は回文でない、という結果になれば成功です。
palindrome_tester(s)のsにracecar、onomatopoeia
をそれぞれ書けばOK。

3.palindrome_tester("racecar")に対してnil?メソッドを呼び出し、戻り値がnilであるかどうかを確認してみてください (つまりnil?を呼び出した結果がtrueであることを確認してください)。このメソッドチェーンは、nil?メソッドがリスト 4.10の戻り値を受け取り、その結果を返しているという意味になります。
→palindrome_tester("racecar").nil?

4.3 他のデータ構造

【演習】
1.文字列 “A man, a plan, a canal, Panama” を ", " で分割して配列にし、変数aに代入してみてください。
a = "A man, a plan, a canal, Panama".split(",")

2.今度は、変数aの要素を連結した結果 (文字列) を、変数sに代入してみてください。
s = a.join

3.変数sを半角スペースで分割した後、もう一度連結して文字列にしてください (ヒント: メソッドチェーンを使うと1行でもできます)。リスト 4.10で使った回文をチェックするメソッドを使って、(現状ではまだ) 変数sが回文ではないことを確認してください。downcaseメソッドを使って、s.downcaseは回文であることを確認してください。
s = s..split(" ")
def palindrome_tester(s)
palindrome_tester(s.split.join.downcase)

4.aからzまでの範囲オブジェクトを作成し、7番目の要素を取り出してみてください。同様にして、後ろから7番目の要素を取り出してみてください。(ヒント: 範囲オブジェクトを配列に変換するのを忘れないでください)
a=('a'..'z').to_a
a[6]
a[-7]

■mapメソッド
配列の要素の数だけブロック内の処理を繰り返し、結果として作成された配列を返す。

■doメソッド
testと一緒に使って、endまでの処理を全て実行する。

【演習】
省略

■ハッシュ
ハッシュ=連想配列

■シンボル
シンボルを使うと早い。
複合配列では
user = { "name" => "Michael Hartl", "email" => "[email protected]" }
user = { :name => "Michael Hartl", :email => "[email protected]" }
user = { name : "Michael Hartl", email : "[email protected]" }
が同じになる様子。

【演習】
省略

4.4 Rubyにおけるクラス

【演習】
省略

■superclass
全てが何かしらのクラスに属している。
railsが全て属させてくれているため、自動でアプリケーションの開発が可能。

【演習】
省略

【演習】
省略

【演習】
省略

【演習】
省略

4.5 最後に

自分のモチベーションの低さに驚愕。
5章やった後に戻ってこよう。