ターミナルを交番に届けたら

多口カタン(katan_t)によるプログラミング系ブログです。

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で書きます。
クラスや例外について取り上げる予定です。