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.
文字列の挿入
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 件のコメント:
コメントを投稿