ぞえの技術めも

Ruby on Rails勉強中

【25日目】【1日20分のRailsチュートリアル】CSSファイル読み込みとRubyにおけるクラス

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

今日は「4.3.4 CSS、再び」から。

4.3.4 CSS、再び

CSSファイルの読み込み箇所を紐解く。

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

実は、Ruby では丸かっこは使用してもしなくても構いません。以下の2つの行は同等です。

# 関数呼び出しの丸かっこは省略可能。
stylesheet_link_tag('application', media: 'all',
                                   'data-turbolinks-track' => true)
stylesheet_link_tag 'application', media: 'all',
                                   'data-turbolinks-track' => true

そうなんだ…!丸かっこあるのに慣れてるから後者はなんか違和感。。。
メソッドの終わりが分かりにくくない?

次に、:media引数はハッシュのようですが、波かっこがない点が不思議です。実は、ハッシュが関数呼び出しの最後の引数である場合は、波かっこを省略できます。以下の2つの行は同等です。

# 最後の引数がハッシュの場合、波かっこは省略可能。
stylesheet_link_tag 'application', { media: 'all',
                                     'data-turbolinks-track' => true }
stylesheet_link_tag 'application', media: 'all',
                                   'data-turbolinks-track' => true

色々省略できすぎじゃない…?慣れると書きやすいのかな。。。

次に、data-turbolinks-trackにおけるキーと値のペアの表記が、旧式のハッシュロケット (=>) スタイルになっている点が不思議です。

変なの、と思ってるところでした。

実は、以下のような新しいハッシュ記法を使用すると、
data-turbolinks-track: true
ハイフン (-) が入っているためにエラーが発生してしまいます。

そういうことか…。じゃあ無理に新しい方使わなくてもいいんじゃ、と思ってしまう…。

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

は実行されると

<link data-turbolinks-track="true" href="/assets/application.css" media="all" rel="stylesheet" />

となるそう。 stylesheet_link_tagの第一引数がCSSファイルのパス(ファイル名?)を示してて、第二引数はmediaの設定とオプション、なのかな。。。

4.4 Rubyにおけるクラス

オブジェクト指向言語の解説、的な章。
他のオブジェクト指向言語は使ったことあるのでさくっといこう。

4.4.1 コンストラクタ

>> s = "foobar"       # ダブルクォートは実は文字列のコンストラクタ
=> "foobar"
>> s = String.new("foobar")   # 文字列の名前付きコンストラクタ
=> "foobar"

この二つの文が意味するものは同じ。
newメソッドで呼び出してもいいよ、ってことかな。あまり使わないかもなー

4.4.2 クラス継承

クラス階層をたどっていくと、 Rubyにおけるすべてのクラスは最終的にスーパークラスを持たないBasicObjectクラスを継承しています。これが、"Rubyではあらゆるものがオブジェクトである" ということの技術的な意味です。

ほー。
この辺りを理解するには自分でクラスを作ってみるのが一番だそうなのでWordクラスを作ってみる。

>> class Word
>>    def palindrome?(string)
>>      string == string.reverse
>>    end
>> end
=> :palindrome?

与えられた文字列が回文になっていたらtrueを返すメソッドを作成。

>> w = Word.new
=> #<Word:0x00000005f16198>
>> w.palindrome?("foobar")
=> false
>> w.palindrome?("level")
=> true

もし上の例が少し不自然に思えるならば、勘が鋭いといえます。

思えませんでした…。

文字列を引数に取るメソッドを作るためだけに、わざわざ新しいクラスを作るのは変です。単語は文字列なので、リスト4.12のようにWordクラスは Stringクラスを継承するのが自然です。

ふーむ。

コンソールを立ち上げ直して、Stringクラスを継承したWordクラスを作成。

>> class Word < String
>>   def palindrome?
>>     self == self.reverse
>>   end
>> end
=> :palindrome?

メソッドの使い方はこんな感じ。
なるほどなー

>> s = Word.new("level")
=> "level"
>> s.palindrome?
=> true

Wordクラスのクラス階層はこんな感じ。

>> s.class
=> Word
>> s.class.superclass
=> String
>> s.class.superclass.superclass
=> Object
>> s.class.superclass.superclass.superclass
=> BasicObject

オブジェクト指向って慣れたらスマートなクラス設計ができるのだろうか…。

今日の作業時間は【32分】
次は「4.4.3 組込みクラスの変更」から。