オレマトペ

Webエンジニアを目指し学習中のデブアラサーによるほぼ擬音ブログ

Ruby on Rails チュートリアル第4章を終えて

f:id:Npakk:20200610222322p:plain

はじめに

このエントリーでは、Railsを勉強している私がRuby on Rails チュートリアルを学習した感想などを、
各章毎に述べていきたいと思います。
このチュートリアルを学ぶ方法は動画、電子書籍など色々な媒体で提供されておりますが、
ここではWebテキスト(第6版)を使用しております。

目次

第4章 Rails風味のRuby

前回、重複コードを排除するため埋め込み型のRubyコードをHTML形式に記載しましたが、
今度は新しく自分で定義した関数を使ってみます。
”カスタムヘルパー”と呼ぶらしい。
ここでは値がAだったらBだったらと条件分岐も行える関数を作成して、
組み込みヘルパー(Rails標準で用意されている関数)から自作のカスタムヘルパーへ変更していきます。

完成したら今度はRubyの言語仕様を学ぶため、Railsコンソールを使用します。
対話的にRubyを操作できるみたい。
この中での操作は基本的に外に影響を与えることはなく、もし異常が発生してもコンソール自体を終了すれば大丈夫とのこと。
また、記述されているRubyコードで気になったものがあれば、RubyAPIを併せて読むと理解しやすくなるらしい。
ただ、英語なので日本語が母語の方は下記で代用してください、とのこと。
ざっと見た感じRuby言語のバージョンごとにリファレンスがあって、便利そう。
プログラミング言語 Ruby リファレンスマニュアル
るりまサーチ

まずは文字列から勉強。
ダブルクオートを用いたリテラル文字列をコンソールに入力すると、ダブルクオートの中の文字列だけが応答として返ってきます。
また、文字列同士をプラス(+)でくっつけると文字列結合が行え、
さらに、式展開を使って文字列の変数と文字列の結合も行いました。

ちなみにダブルクオートで文字列をくくらず、シングルクオートでもくくれるが、上記の式展開は行われません。
シングルクオートの利点としては、”/”や”#”などの特殊文字エスケープ処理せずに出力できる点にあるみたい。
ダブルクオートで同じことをしようとすると、明示的にエスケープ処理を行う必要があるため、めんどくさいらしい。

今度は様々なオブジェクトとその操作を学んでいきます。
数値型を文字列として出力したり、真偽値を駆使して応答値をそれぞれ変更するやり方などを学びます。
なお、Javaなどではオブジェクトの空を表すのは”null”でしたが、Rubyでは”nil”なんですね。
呼び方が似ているため意味も同じだと思うのですが、どういった違いがあるのだろうか。

また関数の作成もコンソール上ではめんどくさいんですが行います。
関数定義→利用→戻り値確認していくのですが、
驚いたのは”暗黙の戻り値”という仕様。

def isEmpty(str)
    return “A” if str.empty?
    return “B”
end

上記のような、rubyの関数があった場合、
後ろにある「return “B”」の「return」はなくてもいいんです。
JavaC#では、ここらへんは静的解析でreturnしろと警告されるのですが、
Rubyは仕様上、明示的にreturnされた戻り値か、 最後に記述された式を戻り値として呼出元に返すみたい。
もし、最後に記述された式が戻り値を表すものではない場合、もしくはそもそも式が記述されていない場合は、
Nilを返却するらしい。
面白いですねー

また、配列についても学びました。
この仕様は他のほとんどの言語と似たようなものなのですが、
”破壊的メソッド”なるものがRubyメソッドには存在します。 a.sort などと記述すると配列の中身をソートした結果を返してくれるのですが、
このa自体の中身は変わらないと。
ただ感嘆符(!)をつけることによって破壊的メソッドに変わり、
aの中身が変わります。
a.sort!

お次は範囲(Range)。
配列の添え字の指定方法や、数値、アルファベットの範囲指定を学びます。
ここは他の言語(私が経験あるのはC#Java)と比較しても、癖が強すぎました。
ただ便利なのは確かです。
記述量があきらかに減らせるケースがあります。
しかし、あまりに見慣れない記法なので、ぱっと見なにをやっているのかわからなかったです←

そしてブロック。
記法は見慣れないためぱっと見わからないですが、じっくり読んでもさっぱりわかりませんw
最初は他言語でのfor文の書き方っぽいものと思っていましたが、調べてみると色んな使い方がありました。
つまるところ引数の一つとして解釈したほうがわかりやすくて、
関数に渡す引数の最後として記述しなくてはいけないみたい。
ブロック引数と呼ばれていたのでそちらの認識で思っておいて、ブロック内にある一時的な変数がありますが( | | で囲んでるもの)これはブロック変数と呼ばれるもの。
ローカルな変数であり外からは参照できません。
難しいですね

そしてクラスの作成方法と、組み込みクラスの変更、継承について学びました。
ここらへんは他言語経験者であればすんなり理解できるかと思います。
ただ一点気になったのは本文中でも触れられているのですが、コントローラクラスのアクションたちが、
def で定義されているんですが、その中身は何も記述されていないのです。
なのに、ルーティングされた場合ページが表示されるんですよ。
うーんいつか触れてくれるのでしょうか…

あとがき

今回はRubyの言語仕様がメインでした。
サンプルアプリケーションのこれまでの実装を見ながら、Rubyの説明をする流れなので、
ある程度最初に疑問をもっておくと伏線回収的なもんであーっと理解出来るかも知れません。
ただ、この4章はかなり長いので、挫折しないようにわからなくても先に進むことも必要かも知れませんね。