第4章 Rails風味のRuby
4.1 動機
ヘルパーを作成する。いまのところヘルパーがなにかまったくわかっていない。
とりあえずヘルパーを作成すると、コードがシンプルになるっぽい。
BEFORE
<%= yield(:title) %> | Ruby on Rails Tutorial Sample App
AFTER
<%= full_title(yield(:title)) %>
4.2 文字列とメソッド
ここではrails consoleでいろいろな動きを試している。
簡単な計算や文字列の結合などだ。
puts
は文字列を出力したいときに使うらしい。
(ちなみに「put」の三人称単数現在形ではなく、「put string」の略らしい。)
そして、print
も同様に文字列を出力するときに使う。
puts
との違いは改行コードが挿入されるかどうかっぽい。
演習。
city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。
割愛
先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
割愛
上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)
タブの特殊文字は「\t」っぽい。
タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?
割愛
次に、各メソッドを使っていく。
length
は文字列の文字数をカウントする。
empty?
は空かどうかを返す。
to_s
はオブジェクトを文字列に変換する。
演習。
"racecar" の文字列の長さはいくつですか? lengthメソッドを使って調べてみてください。
"racecar".length
reverseメソッドを使って、"racecar"の文字列を逆から読むとどうなるか調べてみてください。
"racecar".reverse
変数sに "racecar" を代入してください。その後、比較演算子 (==) を使って変数sとs.reverseの値が同じであるかどうか、調べてみてください。
s == s.reverse
リスト 4.9を実行すると、どんな結果になるでしょうか? 変数sに "onomatopoeia" という文字列を代入するとどうなるでしょうか? ヒント: 上矢印 (またはCtrl-Pコマンド) を使って以前に使ったコマンドを再利用すると一からコマンドを全部打ち込む必要がなくて便利ですよ。)
nil
railsコンソールでは、メソッドの定義もできるらしい。
リスト 4.10のFILL_INの部分を適切なコードに置き換え、回文かどうかをチェックするメソッドを定義してみてください。ヒント: リスト 4.9の比較方法を参考にしてください。
>>def palindrome_tester(s)
if s==s.reverse
puts "It's a palindrome!"
else
puts "It's not a palindrome."
end
end
=> :palindrome_tester
上で定義したメソッドを使って “racecar” と “onomatopoeia” が回文かどうかを確かめてみてください。1つ目は回文である、2つ目は回文でない、という結果になれば成功です。
palindrome_tester("racecar")
=>It's a palindrome!
=> nil
palindrome_tester("onomatopoeia")
=>It's not a palindrome.
=> nil
palindrome_tester("racecar")に対してnil?メソッドを呼び出し、戻り値がnilであるかどうかを確認してみてください (つまりnil?を呼び出した結果がtrueであることを確認してください)。このメソッドチェーンは、nil?メソッドがリスト 4.10の戻り値を受け取り、その結果を返しているという意味になります。
palindrome_tester("racecar").nil?
=>It's a palindrome!
=> true
4.3 他のデータ構造
split
は文字列を自然に変換した配列を得ることができる。もしくは任意の文字で区切ることができる。
いろいろなメソッドが紹介されているが、メソッドには二種類あるらしい。
- 破壊的メソッド
- 非破壊的メソッド
だ。
非破壊メソッドは、メソッドを加えた文字列を変形することはない。破壊メソッドは変形する性質をもっているようだ。
見分け方は「!」がついているかどうか。
演習。
文字列「A man, a plan, a canal, Panama」を ", " で分割して配列にし、変数aに代入してみてください。
今度は、変数aの要素を連結した結果 (文字列) を、変数sに代入してみてください。
a = "A man, a plan, a canal, Panama".split(',')
s = a.join
変数sを半角スペースで分割した後、もう一度連結して文字列にしてください (ヒント: メソッドチェーンを使うと1行でもできます)。リスト 4.10で使った回文をチェックするメソッドを使って、(現状ではまだ) 変数sが回文ではないことを確認してください。downcaseメソッドを使って、s.downcaseは回文であることを確認してください。
s.split(' ').join
s.downcase
aからzまでの範囲オブジェクトを作成し、7番目の要素を取り出してみてください。同様にして、後ろから7番目の要素を取り出してみてください。(ヒント: 範囲オブジェクトを配列に変換するのを忘れないでください)
('a'..'z').to_a[6]
('a'..'z').to_a[-7]
ここまではなんとなく理解したが、4.3.3の演習は難しすぎて回答を見た。
難しいというよりかは、「ハッシュ」「キー」のような言葉に対して不慣れすぎるだけだとは思う。
あとは、文法が頭に入っていないのでさっと出てこないので、理解まで遠いように感じる。
4.4 Rubyにおけるクラス
ここでは「クラス」や「インスタンス」といった単語が出てくる。
これらについて調べても「ふ〜ん」という感じで、理解した感じはしない。
とりあえず、読み進めていくが、RubyにおけるオブジェクトはすべてBasicObject
を継承しているらしいことだけは理解した。
また、Railsでは組み込みクラス(もともと用意されているクラス)は変更可能とのことらしい。
読み進めていくが、まったくおもしろくないので飛ばすことにする...。
先に進めてみて、困ったらまた読み返す。
とりあえずコミットして終了した。