新しくRuby on Railsを勉強し始めたのでメモ。
今まで学んだ言語(php, python, javascript)にはなかったものを中心に。
2017.6.1追記
scivolaさんの大変勉強になるコメントを元に修正しました。
ruby記法
returnを省略可能
rubyではreturnを省略可能。最後の式が暗黙的にreturnになる
def ok()
"ok google" # return "ok google" と同意
end
ok # "ok google"
メソッドの()を省略可能
rubyではメソッドの()を省略可能。 ただしそれはメソッドの定義で初期値を設定している場合のみ。例えば def(i=0,w="")など。これは引数がある場合でも同意
def ok(w1 = "", w2 = "")
"ok! #{w1} and #{w2}"
end
ok("one","two")
# ok! one and two
ok "one","two"
# ok! one and two
変数のスコープ
変数の文頭の記号によってスコープを設定している
グローバル変数($)
一番大きなスコープ。プログラム内で一意
$global_v = 'hoge'
def test
$global_v += 'fuga'
end
test # hogefuga
puts $global_v # hogefuga
インスタンス変数(@)
インスタンの中で一意
# クラスの定義
class Person
def initialize(name)
@name = name
end
def print_name
puts @name
end
end
# インスタンの作成
one = Person.new('hoge')
two = Person.new('fuga')
# 変数の確認
one.print_name # hoge
two.print_name # fuga
クラス変数(@@)
クラス内で一意。インスタンス変数との違いに注意。
# クラスの定義
class Person
def initialize(name)
@@name = name
end
def print_name
puts @@name
end
end
# インスタンの作成
one = Person.new('hoge')
two = Person.new('fuga')
# 変数の確認
one.print_name # fuga
two.print_name # fuga
ローカル変数
一番狭い。定義された関数の中でのみ有効。
def test1
test = 'hoge'
puts test
end
def test2
test = 'fuga'
puts test
end
test1 # hoge
test2 # fuga
puts test # error
範囲
1..10のように書くことで1,2,3,4,5,6,7,8,9,10という範囲を定義できる。pythonのrange(1,10)と似ている。for文とか、配列の作成で使う。
# forでの利用
for i in 1..10
puts i
end
# 配列への展開で利用
(1..3).to_a # [1,2,3]
# オブジェクトを明示的に宣言
Range.new(1,3) == (1..3) # true
後続if
処理の後ろにifを書くことで、条件に一致した場合のみ処理を行うということができる
x = 0
1 + 2 if x > 1 # nil
1 + 2 if x < 1 # 3
語尾に?がつくメソッドはBooleanを表す
empty?やinclude?などの true,falseで値を返すメソッドについては?がついている。 返り値の真/偽を伺うためのメソッド(返り値を条件式に用いるメソッド)に?が付いている。あくまで慣習。
a = "test"
puts "a is empty" if a.empty? #nil
b = [3,4,5]
puts "include 5" if a.include?(5) # include 5
unless構文
ifの逆で判定が偽の場合のみ処理を実行する。
x = 0
unless x > 1 then
puts "ok"
else
puts "no"
end
# "ok"
module
ヘルパー関数(独自関数?)をまとめるもの。module ApplicationHelperを指定するとrailsでは自動的に全てのviewで使える。
module ApplicationHelper
def test()
//処理
end
end
配列の処理
<<で 配列 要素の追加。チェーンすることもできる
a = [1,2]
a.push(3) # [1,2,3]
a << 4 << 5 # [1,2,3,4,5]
数値(文字)..数値(文字)で範囲を表す。
範囲は数値、又はアルファベットの範囲を表す。1..10なら1から10まで。アルファベットで"a".."z"のような記述も可能。
数値を配列に変換。to_aメソッド
a = 0..9
b = (a).to_a # [1,2,3,4,5,6,7,8,9]
配列からカット
a = [22,33,44,55,66]
a[2..4] # 44,55,66
ブロック
よくわからん
{}で囲んで、||で変数を宣言。その後ろで処理。
doとendで囲んでもOK。 do endはrailsのtestのプログラムで使われてる
例文)範囲の各要素に対して2をかけて、それを出力する
# {}の時
(1..3).each{ |i| puts i * 2}
# do endの時
(1..3).each do |i|
puts i * 2
end
# 2
# 4
# 6
例文)配列の各要素を自乗する。mapメソッド
a = [1,2,3]
a.map{ |i| i**2}
# [1,4,9]
例文)省略記法
変数を単体で使う場合は&:を使って省略して記入できる。
ただし、その場合は{}ではなくふつうの関数と同じく()になるので注意。
a = [1.2,2.3,3.3]
a.map(&:ceil)
# [2,3,4]
# a.map{ |i| i.ceil }と同意
%記法
"や'の代わりに使用できる。"と'をエスケープする必要がない。%, %w, %Wやらいろいろ種類がある。後ろの記号()はなんでもよし。
ここがわかりやすい
x = ryo
# 文字列 変数展開
a = %(#{x} is best friend)
# ryo is best friend
# 配列へ格納 式の展開なし
b = %w(ryo kei tuka)
# [ryo, kei, tuka]
ハッシュ(連想配列)
連想配列のことをハッシュという。 配列と違って並び順は固定ではない。 ruby1.9からは並び順も固定。
リテラル記法では=>を使って要素を宣言できる。
{}を使うがブロックとは異なるので注意。
# 空の配列
user = {}
# 要素の定義
user["one"] = "ryo" # { "one" => "ryo"}
# 要素の定義(リテラル記法)
user = { "one" => "ryo", "two" => "yu"}
ハッシュでもeachメソッドとブロックが利用可能。ハッシュの場合は変数を2つ持つ
a = { one:"hello", two:"goodby" }
a.each do |key,value|
%(#{key}と#{value})
end
# oneとhello
# twoとgoodby
シンボル
ハッシュのキーで使われることが多いらしい。:を文頭につける
数字で始まったり空白文字を含むシンボル名の場合は""で囲む
# ハッシュで利用
a = { :one => "ryo", :two => "you" }
# railsでハッシュのキーとしてシンボルを使う場合以下のような省略記法を使う。
b = { one:"ryo", two:"you" }
# a == b
# 空白文字を含むシンボル
:"test test"
# 数字で始まるシンボル
:"1d"
stylesheet_link_tag の解説
<%= stylesheet_link_tag 'application', media: 'all',
'data-turbolinks-track': 'reload' %>
これを解くには
- メソッドの()は省略可能
- 引数の最後がハッシュの場合は{}が省略可能
- 引数の途中で改行可能
というのを知る必要がある。
上を省略せず書くと
<%= stylesheet_link_tag('application', {media: 'all', 'data-turbolinks-track': 'reload'} %>
となる。第一引数でstylesheetoのパスを送り、ハッシュでメディアタイプとturbolink?を送っている。
なぜこんな分かりづらい記法なのだろう。。
改行が適切だと({でネストするより分かりやすい。
実行すると以下になる
<link data-turbolinks-track="true" href="/assets/application.css" media="all"
rel="stylesheet" />
classの継承
class hoge < foo の < でhogeクラスがfooクラスを継承していることを表す
# fooクラスの定義
class Foo
def ok
puts "ok"
end
end
# fooクラスを継承したhogeクラスの定義
class Hoge < Foo
def bad
puts "bad"
end
end
# インスタンスの作成
test = Hoge.new
# 実行
test.ok # ok
test.bad # bad
組み込みクラスの拡張が可能
rubyではたとえ組み込みのクラスでも拡張が可能。
アクセリー
勉強中、getterとかsetterとかまだ理解できてない。
Railsの記法
aタグを生成(link_to)
<%= link_to "Home", "./hoge", id:"test" %>
# 生成されるタグ
# <a href="./hoge" id="test">Home</a>
imageタグの生成(link_to image_tag)
<%= link_to image_tag("rails.png", alt: "Rails logo"),
'http://rubyonrails.org/' %>
# 生成されるタグ
# <img alt="Rails logo" src="/assets/rails-9308b8f92fea4c19a3a0d8385b494526.png" />
# src末尾の連番はrailsが自動的に付与する
パーシャル
htmlのレイアウトを分割することができる。パーシャルのファイルはファイル名の頭に'_'をつける。
レイアウト
'''layout/_test.html.erb
パーシャルです
```パーシャルの読み込み
.
.
<%= render 'layout/test' %>
.
.
アセットパイプライン
railsがassetsをまとめてくれる。読み込み時間の短縮。scssとかcoffeescriptとかの自動コンパイルも。
なんて便利なんだ。
名前付きルート
routeで指定したページのurlをhoge_path、hoge_urlなどのように