2018年8月21日火曜日

Rails Tutorial第4章「Rails風味のRuby」復習

Ruby on Rails チュートリアル「第4章Rails風味のRuby」を復習して理解したことまとめ

Rubyの基本

  • Rubyでは、あらゆるものがオブジェクト
  • オブジェクトとは (いついかなる場合にも) メッセージに応答するもの
  • オブジェクトに渡されるメッセージは、一般にはメソッドと呼ばれる
  • メソッドの実体は、そのオブジェクトに定義された関数

(Rubyでは関数とメソッドには何の違いもない。すべてのメソッドは関数であり、すべての関数はメソッドでもある。あらゆるものがオブジェクトなので。)


>> "foobar".length        # 文字列に "length" というメッセージを渡す
=> 6
  • Rubyのオブジェクトのうち、オブジェクトそのものの論理値がfalseになるのは、(falseというオブジェクト自身を除いて) nilだけ
  • Rubyは改行の有無に左右されない
実は、Railsは確かにRubyで書かれていますが、既にRubyとは別物なのです。Railsのクラスは、普通のRubyオブジェクトと同様に振る舞うものもありますが、多くのクラスにはRailsの魔法の粉が振りかけられています。Railsは独特であり、 Rubyとは切り離して学習する必要があります。

配列


>> a = [42, 8, 17]
=> [42, 8, 17]
>> a[0]               # 配列へのアクセスには [ ] を使用する
=> 42
>> a.first            # とかでもアクセスできる
=> 42
>> a.length        # メソッドにも応答できる(配列もオブジェクトなので)
=> 3
「あらゆるものがオブジェクト」→Java で言うここらへんと違うってことかな→ On the New Orbit: Stringとcharの違い(Java)

破壊的メソッド


>> a
=> ["foo", "bar", "baz"]
>> a.sort
=> ["bar", "baz", "foo"]
>> a
=> ["foo", "bar", "baz"] # a自体の順番は変わってない
>> a.sort! # sortの破壊的メソッド
=> ["bar", "baz", "foo"]
>> a
=> ["bar", "baz", "foo"] # a自体の順番がかわる

Rubyの配列は、他の多くの言語の配列とは異なり、さまざまな型を共存させることが可能

範囲 (range)


>> 0..9    # range
=> 0..9
>> (0..9).to_a            # 範囲にto_aを実行
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]    # 配列に変換される

(余談)
%記法
http://blog.toshimaru.net/ruby-percent-notation/#i


>> a = %w[foo bar baz] # スペース区切ったそれぞれが文字列のArrayとなる
=> ["foo", "bar", "baz"]
>> a = %i[foo bar baz] # %iとするとシンボルのArray
=> [:foo, :bar, :baz]

ブロック


>> (1..5).each do |i|
?>   puts 2 * i
>> end
2
4
6
8
10
=> 1..5

do .. end または { } で囲まれた部分 =block
|i| =block variable
.each =method
it’s up to the method to know what to do with the block
例:
.each =各要素の値をこの変数に次々に代入してブロックを実行
.map =各要素に対して、与えられたブロックを適用した結果を返す

Railsの組み込み関数

  • 関数
    • 組み込み関数
    • 追加で作成する関数=ヘルパー

括弧を使わない関数呼び出し

Ruby では丸括弧は使用してもしなくてもOK


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

ハッシュが関数呼び出しの最後の引数である場合は、波括弧を省略できる


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

ハッシュ

  • 本質的には配列と同じだが、インデックスとして整数値以外のものも使用できる(Perl等では「連想配列」と呼ばれる)
  • ハッシュのインデックス=key
  • キーと値のペアを波括弧{}で囲んで表す(※ハッシュの波括弧は、ブロックの波括弧とはまったく別物)
    user = { "first_name" => "Michael", "last_name" => "Hartl", "thisis_key" => "This is Value" }

>> user = {}                          # {}は空のハッシュ
=> {}
>> user["first_name"] = "Michael"     # キー: "first_name"、値: "Michael"
=> "Michael"
>> user["first_name"]                 # 配列と同じ方法で要素にアクセスできる
=> "Michael"
>> user                               #リテラル表記
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}

シンボル

:name みたいな、コロンを前においてあるやつ。

  • ハッシュのキーとして、Railsでは文字列よりもシンボルを使用する方が普通

>> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> user[:name]              # :name に一致する値にアクセスします。
=> "Michael Hartl"

※ハッシュではシンボルをキーとして使うことが一般的なので、Ruby 1.9ではこのような特殊な場合のための新しい記法をサポートしている(よくrubocopに指摘されるやつがたぶんこれ)
下記の二つはおなじ。


>> h1 = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> h2 = { name: "Michael Hartl", email: "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}

キーの名前の (前ではなく) 後にコロンを置き、その後に値が続くように置き換える。

※ただし、シンボルではハイフンを使用できない

× data-turbolinks-track: true (:data-turbolinks-trackというシンボルは作成できない)
"data-turbolinks-track" => true

ハッシュのネスト

ハッシュの値(value)にはほぼ何でも使用することができ、他のハッシュを使用することもできる。
例:下記のハッシュ`params`は、keyが`:user`というシンボル、valueが`{ name: ... }`というハッシュ


>> params = {}        # 'params' というハッシュを定義
=> {}
>>params[:user] = { name: "Michael Hartl", email: "mhartl@example.com" }
=> {:name=>"Michael Hartl", :email=>"mhartl@example.com"}
>> params
=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}

さらに別のハッシュも格納


>>params[:project] = { name: "Rails Tutorial", site: "http://railstutorial.com" }
=> {:name=>"Rails Tutorial", :site=>"http://railstutorial.com"}
>> params
=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}, :project=>{:name=>"Rails Tutorial", :site=>"http://railstutorial.com"}}
>> params[:user][:name] # `params`ハッシュの中のkey`:user`ハッシュの中のkey`:name`のvalueにアクセス
=> "Michael Hartl"
>> params[:project][:name]
=> "Rails Tutorial"

モジュール

application_helper.rb

module ApplicationHelper
end

Modules give us a way to package together related methods.
When writing ordinary Ruby, you often write modules and include them explicitly yourself, but in the case of a helper module Rails handles the inclusion for us.
The result is that the methods inside module ApplicationHelper are available in all views.

(from: https://www.railstutorial.org/book/rails_flavored_ruby )

文字列の挿入

Rubyはシングルクォート文字列の中では式展開を行いません。

戻り値

Rubyの関数は 暗黙の戻り値を持つ(最後に評価された式の値が自動的に返される)


>> def string_message(string)
>>   if string.empty?
>>     "It's an empty string!"
>>   else
>>     "The string is nonempty."
>>   end
>> end


>> def string_message(string)
>>   return "It's an empty string!" if string.empty?
>>   return "The string is nonempty."
>> end

は同じ結果を返す。

0 件のコメント:

コメントを投稿