プログラミング備忘録

プログラミングの学習状況をメモしています

40日目

今日の学習

Ruby

railstutorial.jp

省略可能なRubyのコード

Rubyは、引数の( )を省略できたり、ハッシュを書くにしても三通りほどあったりと、一つの書き方しか知らない場合は「新しく見るコードだ」となってしまったり、「このコードが意味することが分からない……」となったりする。

Railsチュートリアルを進める中で、適当に流していたコードが実は普段自分が書いている冗長なコードと意味合いは同じだということにようやく気付き、今まで謎だった形のものがようやく理解できるようになってきた。

第4章 4.3.4で紹介されている、以下のようなCSSをレイアウトに追加するコードがある。

<%= stylesheet_link_tag 'application', media: 'all',
                                       'data-turbolinks-track': 'reload' %>

正直、自分が知らない文法で書かれているんだろうなとずっと思っていた。

しかしそんなことはなく、省略されているところをしっかり拾っていけばいつも使っている形と何ら変わりのないコードだった。

stylesheet_link_tag この部分がいわゆるメソッドであり、その後ろは引数になる。

引数にはかっこをつけるということを常にしているので、かっこがないと引数だとまだまだ認識できずにいる。メソッド以下の、この部分は実際にはかっこが省略されている引数だ。

`('application', media: 'all'‘, 'data-turbolinks-track': 'reload')‘

この中に、:が入っており、そういう形なんだろうなという認識をただただしていたが、これは波かっこ{ }が省略されているだけでハッシュの形だ。

{ media: 'all'‘, 'data-turbolinks-track': 'reload' }

keyがmediaで、valueall……というハッシュだ。Rubyを勉強している人に笑われるかもしれないが、これをハッシュだと認識できていなかったのだ。

上のコードでは、ハッシュがメソッド呼び出しの最後の引数である場合は、波かっこ{ }を省略できるため、最終的に二つのかっこを省略して最初のようなコードの形になっている。

省略できる条件自体は、確かにRuby本でも学習していたのだが、実際に頭に全く入っていなかったようで恥ずかしい。

stylesheet_link_tagは二つの引数を持っている。

一つ目の引数applicationは、スタイルシートへのパスを渡している。

二つ目の引数のハッシュ部分では、最初にメディアのタイプを示し、次にturbolinksという機能をonにする設定をしている。

呪文のように見えていたコードの意味が分かるようになって、Railsの解像度が増したように思う。

link_toメソッドなんかも、今までRubyと同じメソッドだという認識があまりなく、言語ごとに書き方が異なるのと同じように、ただ単にRailsではこういう書き方をするんだな、という雑な理解をしていた。

link_to 'Index', index_path

これも、引数が二つある状態で、自分が分かりやすいように書くのだとすれば、

link_to('index', index_path)

このようなメソッドの形だったということになる。

こんなことで「なるほど!」と今更のように納得しているのは自分くらいな気がするが、分からないということが分からない状態だったので調べようとすら思わなかった。本当にRailsの文法的なものだと思っていたのだ。

クラス

こちらもまた初っ端から衝撃的だったのだが、変数に文字列を代入したりしている何気ない行為も、実は省略形だった。

# 普段よく行う変数への定義
name = "長谷川"

# 実はこの形の省略形
name = String.new("長谷川")

最初から存在しているStringクラス を呼び出しnewメソッドを利用して、そこからStringのインスタンスを生成していたということになる。

文字列のオブジェクトを暗黙で作成するリテラルコンストラク

*コンストラクタ...クラスのデータ初期化処理を行う特別なメソッド(つまるところinitialize)

配列やハッシュにしても同じで、

num = [1, 2, 3]

# Arrayクラスが呼び出されている
num = Array.new([1, 3, 2])

何気なくしている四則演算なども、以下のようにメソッドと引数の状態。

1 + 1

# 1に対して、+メソッドを呼び出して引数として1を渡している
1.+(1)

意識せずとも、Ruby側が勝手に判断してメソッドを呼び出して作ってくれていたので、一番最初からクラスを活用していた。

Stringクラス内部のself.を省略

クラス内で使うとオブジェクト自身を表すことができるself

# 回文かどうかを確かめるメソッドをWordクラスに作成
class Word < String
  def palindrome?
    self == self.reverse
  end  
end 

WordクラスはStringクラスを継承している。

Stringクラスの内部では、メソッドや属性を呼び出すときの.selfが省略可能になる。

# 回文かどうかを確かめるメソッドをWordクラスに作成
class Word < String
  def palindrome?
# .selfを省略してもよい
    self == reverse
  end  
end 

Railsの中のRuby

Railsに書かれているコードがどういった形式のものなのかに対する理解が深まったが、Railsのアクションには戻り値がなかったりする。

例えば、よく使うhomeアクションはWebページを表示させるものであり、値を返すものではない。

RailsRubyで書かれているが、Rubyとは別物であるという意識を持っておく必要がある。