Rubyを基本からやり直した

Rubyを久しぶりに書くことになり、不安だったのでドットインストールでおさらいすることにした。その時のメモをここに書いておく。
ドットインストール Ruby入門(全23回) http://dotinstall.com/lessons/basic_ruby_v2

[ruby]print “Hello world!” #終わったあとに改行がない
puts “Hello world!” #改行がある
p “hello world(p)” #データの形式がわかるように表示
#複数行に渡るコメントはbeginとendで。
=begin
コメント
コメント
=end[/ruby]
#変数:データにつけるラベル(英小文字から始まる)
#定数:変更されないデータにつけるラベル(英大文字から始まる。通例として全て大文字とする)
[ruby]msg = “hello world!”
p msg
ADMIN_EMAIL = “hoge@gmail.com”[/ruby]
#データ(Rubyのデータは全てオブジェクト。いろんな便利な命令が詰まったデータ型。)
# – メソッド(便利な命令。クラスで定義されている。クラスはオブジェクトの設計図のようなもの。
#全てのデータは何らかのクラスに属している。公式サイトから見ることができる。 http://ruby-doc.org/core-2.0.0/#class-index
[ruby]p “hello world”.length #文字列の長さを返してくれる[/ruby]
#数値オブジェクト-Numericクラスで定義
[ruby]x = 10 #整数値 100_000_000 アンダーバーを無視するという仕様。
y = 20.5 #実数値
z = 1/3r #分数値 Rational(1, 3)

#使える演算子 + – * / % **

p x % 3 # 1
p x ** 3 # 1000
p z * 2 # 2/3
#x = x + 5 → x +=5 #自己代入
p y.round #四捨五入[/ruby]
#文字列オブジェクト-Stringクラスで定義
[ruby]name = “temosy”
x = “hello world, #{name}” #変数展開、特殊文字(改行\n タブ\t)を使える
y = ‘hello world, #{name}’

puts x #ちゃんと展開される
puts y #展開できないのでそのまま表示される

#連結するときには+, 繰り返す時は*が使える
puts “hello world” + ” temosy”
puts “hello world” * 5[/ruby]
# ! 破壊的メソッド
# ? 真偽値を返すメソッド
[ruby]s = “temosy”
puts s.upcase! #元データを書き換えたい場合は破壊的メソッドを使う
p s.empty? # false[/ruby]
#配列オブジェクト-Arrayクラスで定義
[ruby]sales = [5, 8, 4] #文字列を入れたり、配列の中に配列を入れることも可能。
p sales[1] #添字(インデックスは0から始まる)

#添字の範囲指定方法
p sales[0..2] #0から2を取得
p sales[0…2] #0から2未満を取得
p sales[-1] #最後の要素を取得
p sales[1, 2] #一番目から2個分取得

#複数の要素を書き換え
sales[0…2] = [1 , 2] #0から2未満を次の要素で書き換え
p sales #[1 ,2 , 4]

#複数の要素を挿入
sales[1,0] = [10, 11, 12] #1から0個分を次の要素で書き換え。実質的に挿入される。
p sales #[5, 10, 11, 12, 8, 4]

#複数の要素を削除
sales[0, 2] = [] #0から2個分を空配列に。
p sales #[4]

#よく使うメソッド
p sales.size #要素数を取得できる
p sales.sort #小さい順にソート
p sales.sort.reverse #大きい順にソート
p sales.push(100) #配列の末尾に要素を追加
sales << 100 << 102 #配列の末尾に複数の要素を追加[/ruby] #ハッシュ-Hashクラスで定義(配列と同じように複数の値を管理できる。配列と違い識別子であるkeyを付けることができる) [ruby]#key value sales = {:A-san => 200, :B-san => 300}
p sales[:A-san]

#Ruby 1.9からはこのような書き方もできる
sales = {A-san: 200, B-san: 300}
p sales[:A-san]

#よく使うメソッド
p sales.size #要素数を返す
p sales.keys #keyだけを返す
p sales.values #valueだけを返す
p sales.has_key?(:A-san) #そのkeyがあるかどうかを真偽値で返す[/ruby]
#オブジェクトの変換
[ruby]
a = 10
b = “5”
p a + b.to_i #to integerの略。整数値15が返ってくる
p a + b.to_f #to floatの略。実数値15.0が返ってくる
p a.to_s + b #to stringの略。連結されて文字列105が返ってくる

h= {A-san: 100, B-san: 200}
p h.to_a #ハッシュを配列に変換
p h.to_a.to_h #配列をハッシュに変換[/ruby]
# %記法(エスケープシーケンスを書かなくて済む)
[ruby]s =”hello”
s =%Q(hello)
s =%(hello)

s =”hel\”lo”
s =%Q(hel”lo)
s =%(hel”lo)

s =’hel\”lo’
s =%q(hel”lo)

#配列の%記法(ダブルクォーテーションをたくさん書かなくて済む)
a = [“a”, “b”, “c”]
a = %W(a b c)

a = [‘a’, ‘b’, ‘c’]
a = %w(a b c)[/ruby]
#条件分岐 if文
[ruby]=begin
比較演算子
> < #より大きい、より小さい >= <= #以上、以下 == != #等しい、等しくない && (AND) || (OR) ! (NOT) =end sore = 80 if score > 60
puts “OK!”
elseif score > 40
puts “SOSO…”
else
puts “NG!”
end[/ruby]
#真偽値と条件演算子
[ruby]#false: false nil(オブジェクトが存在しない)
#true: それ以外(0 ”を含む)

if x #←演算子が無いがtrueが省略されている
puts “…”
end

#b = 10
#c = 20
b, c = 10, 20 #多重代入
a = b > c ? b : c #bがcより大きかったらbを返しなさい。そうでなければcを返しなさい。
puts a #20[/ruby]
条件分岐 case文
[ruby]signal = “red”

case signal
when “red”
puts “STOP!”
when “green”
puts “GO!”
when “yellow”
puts “CAUTION!”
else
puts “wrong signal”
end[/ruby]
#繰り返し処理 times、while、break、next
[ruby]
#times
3.times do |i|
puts “#{i}: hello”
end

#while
i = 0
while i < 3 do puts "#{i}: hello" i +=1 end #break:ループを抜ける 3.times do |i| if i == 1 break end puts "#{i}: hello" end #next:ループを1回スキップ 3.times do |i| if i == 1 next end puts "#{i}: hello" end[/ruby] #繰り返し処理 for、each [ruby] #for for i in 0..2 do puts i end for color in ["red", "blue", "pink"] do puts color end #each {"red"=>200, “blue”=>100, “pink”=>50}.each do |color, price|
puts “#{color}: #{price}”
end[/ruby]
#関数的メソッド-自分でメソッドを作る方法
[ruby]def sayHi(name = “Steve”)
puts “hello! ” + name
s = “hello! ” + name
return s
end

sayHi(“Tom”)
sayHi(“Bob”)
sayHi()
greet = sayHi()
puts greet[/ruby]
#クラスの作り方
[ruby]
#クラス(オブジェクトの設計図)
#メソッドの定義
#インスタンスを作成

class User #クラス名は大文字から始まる

@@count = 0 #クラス変数(@@で始まる。クラス共通でデータを保持するときに使う)

def initialize(name) #クラスからオブジェクト(インスタンス)を作成
@name = name #インスタンス変数は@から始まる(そのインスタンス内の別のメソッドから呼び出せる)
@@count += 1 #インスタンスが初期化される度にカウントを増やす
end

def sayHi #インスタンスメソッド(インスタンスから呼び出せる)
puts “hello, my name is #{@name}”
end

def User.sayHello #クラスメソッド(クラスから直接呼び出せる)
puts “hello from User class (#{@@count} users)”
end
end

tom = User.new(“Tom”)
tom.sayHi()

bob = User.new(“Bob”)
bob.sayHi()

User.sayHello()[/ruby]
#クラスの継承(性質を受け継ぎつつ、少し違ったクラスを作成する)
[ruby]
class User

def initialize(name)
@name = name
end

def sayHi
puts “hello, my name is #{@name}”
end

end

class SuperUser < User #Userクラスの性質を継承し、メソッドを追加。 def shout puts "HELLO! from #{#name}!" end end tom = User.new("Tom") bob = SuperUser.new("Bob") tom.sayHi() bob.sayHi() bob.shout()[/ruby] アクセサ(getter, setter)の使い方(インスタンス変数に外部からアクセスする) [ruby] #今までクラスをインスタンス化してメソッドを作ってきたが、同じようにインスタンス変数にアクセスできれば便利。 class User def initialize(name) @name = name end =begin #getter def name #return @name @name #returnは省略できる。 end #setter def setName(newName) @name = newName end =end attr_accessor :name #シンボルでインスタンス変数の名前を与えるとgetterとsetterをまとめて自動生成できる。 attr_reader :name #getterだけを自動生成することができる attr_writer :name #setterだけを自動生成することができる def sayHi puts "hello, my name is #{@name}" end end bob.User.new("Bob") bob.sayHi() #p bob.name # undefined method 'name' (NomethodError)のエラーになる。クラスのインスタンス変数は外部からアクセスできない。 #bob.setName("Tom") bob.name = "Tom" bob.seyHi()[/ruby] #Timeクラス(時間計算などに使える) [ruby] t = Time.now #現在時刻を取得 t = Time.new(2013, 12, 25, 12, 32, 22) #2013-12-25 12:32:22 +0900 t += 10 #10秒足す t.strftime("Updated: %Y-%m-%d") p t.year p t.month[/ruby]