Rubyを基本からやり直した

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

print "Hello world!" #終わったあとに改行がない
puts "Hello world!" #改行がある
p "hello world(p)" #データの形式がわかるように表示
#複数行に渡るコメントはbeginとendで。
=begin
コメント
コメント
=end

#変数:データにつけるラベル(英小文字から始まる)
#定数:変更されないデータにつけるラベル(英大文字から始まる。通例として全て大文字とする)
msg = "hello world!"
 p msg
ADMIN_EMAIL = "hoge@gmail.com"

#データ(Rubyのデータは全てオブジェクト。いろんな便利な命令が詰まったデータ型。)
# – メソッド(便利な命令。クラスで定義されている。クラスはオブジェクトの設計図のようなもの。
#全てのデータは何らかのクラスに属している。公式サイトから見ることができる。 http://ruby-doc.org/core-2.0.0/#class-index
p "hello world".length #文字列の長さを返してくれる
#数値オブジェクト-Numericクラスで定義
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 #四捨五入

#文字列オブジェクト-Stringクラスで定義
name = "temosy"
x = "hello world, #{name}" #変数展開、特殊文字(改行\n タブ\t)を使える
y = 'hello world, #{name}'

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

#連結するときには+, 繰り返す時は*が使える
puts "hello world" + " temosy"
puts "hello world" * 5

# ! 破壊的メソッド
# ? 真偽値を返すメソッド
s = "temosy"
puts s.upcase! #元データを書き換えたい場合は破壊的メソッドを使う
p s.empty? # false

#配列オブジェクト-Arrayクラスで定義
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 #配列の末尾に複数の要素を追加

#ハッシュ-Hashクラスで定義(配列と同じように複数の値を管理できる。配列と違い識別子であるkeyを付けることができる)
#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があるかどうかを真偽値で返す

#オブジェクトの変換
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 #配列をハッシュに変換

# %記法(エスケープシーケンスを書かなくて済む)
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)

#条件分岐 if文
=begin
比較演算子
> < #より大きい、より小さい
>= <= #以上、以下
== != #等しい、等しくない

&& (AND)
|| (OR)
! (NOT)
=end

sore = 80
if score > 60
  puts "OK!"
elseif score > 40
  puts "SOSO..."
else
  puts "NG!"
end

#真偽値と条件演算子
#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

条件分岐 case文
signal = "red"

case signal
when "red"
  puts "STOP!"
when "green"
  puts "GO!"
when "yellow"
 puts "CAUTION!"
else
 puts "wrong signal"
end

#繰り返し処理 times、while、break、next
#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

#繰り返し処理 for、each
#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

#関数的メソッド-自分でメソッドを作る方法
def sayHi(name = "Steve")
  puts "hello! " + name
  s = "hello!  " + name
  return s
end

sayHi("Tom")
sayHi("Bob")
sayHi()
greet = sayHi()
puts greet

#クラスの作り方
#クラス(オブジェクトの設計図)
#メソッドの定義
#インスタンスを作成

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()

#クラスの継承(性質を受け継ぎつつ、少し違ったクラスを作成する)
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()

アクセサ(getter, setter)の使い方(インスタンス変数に外部からアクセスする)
#今までクラスをインスタンス化してメソッドを作ってきたが、同じようにインスタンス変数にアクセスできれば便利。
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()

#Timeクラス(時間計算などに使える)
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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です