Rubyの基本文法まとめ その1
いつ頃からか忘れましたが、なんかみんなRailsで楽しそうにやってるなって、思っていたのですよ。
嫉妬心に近い感情だったわけですよ。
「フレームワークに頼りまくってるんじゃねえよ、この軟弱者たちが」
なんて毒づきながらも、JavaScriptよくわからずにjQuery使ってたりしたわけなんですよ。
そろそろ嫉妬することに疲れてきたので、昨年(2013年)の終わりに、Railsやってみようって思いました。
で、Railsをやるには、Rubyを知っていないといけないわけなんですよね?
Ruby on Railsって名前なわけですし。
ということでRubyの勉強を始めて、すぐに三ヵ月の休みに入って、また少し前に再開しました。
まだ基礎中の基礎しかやっていないんですが、ここまでの簡易まとめです。
チートシート的なものです。
動作確認はRuby2.0.0でしています。
拡張子
いきなり文法とは関係ないですが、Rubyのファイルの拡張子は一般に
.rb
です。
文字コード指定
# encoding:utf-8
先頭行にこう書くと日本語含むスクリプトファイルでも正常に動作します。
こういうのをマジックコメントと呼びます。
Ruby2.0以降はutf-8がデフォルトなので上記記述不要ですが、紹介だけ。
※マジックコメントについて記述ミスありましたので修正しました。 Ruby2.0はエンコーディングのデフォルトがUTF-8になったため、UTF-8の指定不要です。
コメント
# 一行のコメント =begin 複数行の コメント =end
出力
p 'キュアサンシャイン' #=> "キュアサンシャイン" puts 'キュアピース' #=> キュアピース print 'キュアロゼッタ' #=> キュアロゼッタ
端的に言うと
- pは読みやすい形式で改行付き出力(文字列なら"がついたり、配列なら[]で挟まれたり)
- putsは改行付き出力(改行がつくのは文字列の最後に改行がないときのみ)
- printは改行無し出力
詳しくは調べてみてください。
他にもprintf等あります。
変数
hoge = 1 puts hoge #=> 1
型宣言は不要です。
hoge_temp = 'precure'
英小文字、_繋ぎが命名規則です。
文字列に変数
hoge = 5 puts "precure #{hoge}" #=> precure 5
#{変数名}
です。
この場合、文字列は"(ダブルクォーテーション)で挟む必要があります。'(シングルクォーテーション)ではだめです。
また、"(ダブルクォーテーション)で挟んだときにはバックスラッシュ記法(\nで改行とか\tでタブとか)も使えます。
分岐1 if
hoge = 3; if hoge < 0 puts 'マイナスです' elsif hoge > 0 puts 'プラスです' else puts 'プラスでもマイナスでもないです' end #=> プラスです
分岐2 case
hoge = 'black' case hoge when 'white' puts '白' when 'blue' , 'red' puts '青か赤' when 'black' puts '黒' else puts 'なし' end #=> 黒
分岐にはifとcaseの他にunless(ifの逆で条件を満たさないときに実行)というものもあります。
配列の定義と引数指定
precure = ['Black', 'White', 'Sunshine', 'Peace', 'Rosetta'] puts precure[0] #=> Black # 1番目の要素から3つ p precure[1..3] #=> ["White", "Sunshine", "Peace"] # 末尾から2番目 puts precure[-2] #=> Peace
配列への要素追加と取り出し
precure = ['Black', 'White'] precure.push('Sunshine') p precure #=> ["Black", "White", "Sunshine"] precure.push('Peace', 'Rosetta') p precure #=> ["Black", "White", "Sunshine", "Peace", "Rosetta"] precure.pop p precure #=> ["Black", "White", "Sunshine", "Peace"] precure.pop(3) # 3つpop p precure #=> ["Black"]
配列の置換と挿入
precure = ['Black', 'White', 'Sunshine', 'Peace', 'Rosetta'] precure[1] = 'Honey' p precure #=> ["Black", "Honey", "Sunshine", "Peace", "Rosetta"] precure[2,3] = ['Peach' , 'Berry' , 'Pine'] # 2番目からの3つの要素を置換 p precure #=> ["Black", "Honey", "Peach", "Berry", "Pine"] precure.insert(2 , 'Passion' , 'Fresh') # 2番目に挿入 p precure #=> ["Black", "Honey", "Passion", "Fresh", "Peach", "Berry", "Pine"]
挿入は
precure[2,0] = ['Passion' , 'Fresh'] # 2番目にて0個置換、つまり挿入
でも同様です。
配列でよく使いそうなその他メソッド
arr = [1, 6, 4, 10, 2] puts arr.length #=> 5 puts arr.size #=> 5 puts arr.join(',') #=> 1,6,4,10,2 p arr.sort #=> [1, 2, 4, 6, 10] p arr #=> [1, 6, 4, 10, 2] p arr.sort! #=> [1, 2, 4, 6, 10] p arr #=> [1, 2, 4, 6, 10]
sort!は元配列を変えます。
このような自身の中身を変えるものを破壊的メソッドと呼びます。
最後についている!は破壊的メソッドを意味します。
(例外はあります。また、破壊的メソッドなら必ず!がつくというわけではありません)
ちなみにbooleanを返すメソッドは終わりが?です。 (これも絶対ではありません)
今後自分でメソッドを定義する際も、このルール(!とか?)に従っておけばわかりやすいです。
ハッシュの書き方1
foo = {'black' => 'Nagisa' , 'white' => 'Honoka'} puts foo['white'] #=> Honoka
ハッシュの書き方2 シンボル
foo = {black: 'Nagisa' , white: 'Honoka'} # {:black => 'Nagisa' , :white => 'Honoka'} と同様 puts foo[:white] #=> Honoka
頭に:がついたものをシンボルと呼びます。
シンボルとは、文字列的な使い方をするものですが、実際には文字列と完全に等しいものではありません。
キー名等といった文字の意味を明確にしたいとき等に使われます。
シンボルについて詳しくは↓を参照ください。
http://docs.ruby-lang.org/ja/2.0.0/class/Symbol.html
ハッシュでよく使いそうなメソッド
foo = {black: 'Nagisa' , white: 'Honoka'} puts foo.length #=> 2 puts foo.size #=> 2 puts foo.key?(:black) #=> true foo.delete(:black) p foo #=> {:white=>"Honoka"} boo = {Blossom: 'Tsubomi' , Marine: 'Erika'} p foo.merge(boo) #=> {:white=>"Honoka", :Blossom=>"Tsubomi", :Marine=>"Erika"} p foo #=> {:white=>"Honoka"} p foo.merge!(boo) #=> {:white=>"Honoka", :Blossom=>"Tsubomi", :Marine=>"Erika"} p foo #=> {:white=>"Honoka", :Blossom=>"Tsubomi", :Marine=>"Erika"}
繰り返し1 while
hoge = 0 while hoge < 10 print "#{hoge} " hoge += 1 end #=> 0 1 2 3 4 5 6 7 8 9
余談ですがRubyには++(インクリメント)と--(デクリメント)がありません。
Rubyにおける変数はプリミティブ型ではないから(インスタンスだから)、ってことですかね。
繰り返し2 for
for i in 0..9 print "#{i} " end #=> 0 1 2 3 4 5 6 7 8 9
繰り返し3 times
3.times do print 'precure ' end #=> precure precure precure
何回目の繰り返しかをとるには↓のようにする。
10.times do |i| print "#{i} " end #=> 0 1 2 3 4 5 6 7 8 9
breakとnext
for i in 0..9 if i % 2 == 0 next end if i == 7 break end print "#{i} " end #=> 1 3 5
- nextは最も内側のループでの以降の処理を行わず最初に飛ぶ。
- breakは最も内側のループを抜け出す。
==とequal?
上の例では比較の際に==を使いましたが、equal?もよく使います。
端的に言えば==は値の比較、equal?はオブジェクトの比較となります。
p 3 == 3 #=> true p 3 == 3.0 #=> true p 3.equal?(3) #=> true p 3.equal?(3.0) #=> false
配列の走査
forの場合
precure = ['Black', 'White', 'Sunshine', 'Peace', 'Rosetta'] for val in precure do print "#{val} " end #=> Black White Sunshine Peace Rosetta
eachの場合
precure = ['Black', 'White', 'Sunshine', 'Peace', 'Rosetta'] precure.each do |val| print "#{val} " end #=> Black White Sunshine Peace Rosetta
ハッシュの走査
forの場合
boo = {Blossom: 'Tsubomi' , Marine: 'Erika'} for val in boo do print "#{val[0]}/#{val[1]} " end #=> Blossom/Tsubomi Marine/Erika
eachの場合
boo = {Blossom: 'Tsubomi' , Marine: 'Erika'} boo.each do |val| print "#{val[0]}/#{val[1]} " end #=> Blossom/Tsubomi Marine/Erika
正規表現
正規表現そのものについて詳しくは調べてみてください。
ここでは基本的な使い方だけです。
まずはマッチするかどうか。
pattern = /[a-z]+/ p pattern === 'precure' #=> true p pattern === 'Precure' #=> true p pattern === 'PRECURE' #=> false
開始位置取得は以下の通り。
pattern = /[a-z]+/ p pattern =~ 'YOU ARE precure' #=> 8 p pattern =~ 'YOU ARE PRECURE' #=> nil
次にグループ毎の取得です。
$数で取得します。
pattern = /([a-z]+)\s+([a-z]+)/ pattern =~ 'heartcatch precure' puts $1 #=> heartcatch puts $2 #=> precure
最後に
続きはその2で書きます。
クラスや例外について取り上げる予定です。