読者です 読者をやめる 読者になる 読者になる

Ruby (on Rails)入門 ~現在、勉強中(2015年6月開始)~

Ruby、Ruby on Railsを勉強中。参考書を読んだり、ネット情報を読むだけでは忘れてしまうのでメモする。

Ruby勉強中のメモ

配列

  • 配列には複数の要素を格納することができる
  • 配列にはどのようなオブジェクトも要素として格納できる。(同じ配列に数値と文字列の混在などできる)

配列の使い方

配列の作成

person = ["田中", "山田", "佐藤"]

※空の配列の作成

person = []

配列内の要素の操作

要素の参照

person[0] # 田中
person[2] # 佐藤

要素の変更

person[0] = "渡辺"

要素の追加

person[3] = "吉田"

※間を飛ばして追加。飛ばされた部分はnilとなる。

person[10] = "吉村"

要素の数

person.size # 10

ハッシュ

  • ハッシュには複数の要素を格納できる
  • 要素に名前(キー)を付けて操作する

ハッシュの使い方

ハッシュの作成

シンボルを名前(キー)に使う場合

sato = {:name => "佐藤", :tel => "000011113333", :age => 23}

※シンボルとは
要素にアクセスする際に使うラベルのようなもの。
名前の前に「:」をつけるとシンボルとなる。

文字列を名前(キー)に使う場合

tanaka = {"name" => "田中", "tel" => "000011114444", "age" => 33}

ハッシュの操作

要素の参照

シンボルを名前(キー)に使う場合

sato[:name]  # 佐藤

文字列を名前(キー)に使う場合

tanaka["name"]

要素の変更

シンボルを名前(キー)に使う場合

sato[:name] = "さとう"

文字列を名前(キー)に使う場合

tanaka["name"] = "たなか"

要素の追加

シンボルを名前(キー)に使う場合

sato[:hobby] = "読書"

文字列を名前(キー)に使う場合

tanaka["hobby"] = "映画鑑賞"

オブジェクト、クラス

  • オブジェクトはデータを表現する単位
  • 数値オブジェクト、文字列オブジェクト、配列オブジェクトなど他にもある
  • クラスはオブジェクトの種類

クラスの例

Numeric, String, Arrayなど

変数

変数の決まり

どの種類の変数かは変数名で決まる。

ローカル変数とグローバル変数の違い

グローバル変数はプログラムのどこからでも変更できる(変更できてしまう)。
グローバル変数を使う場合はよく考えて使うこと。

  • プログラムの修正などでグローバル変数を変更した場合、他のプログラムで不具合が出る可能性がある。
  • プログラムの様々な部分でグローバル変数を参照・変更してしまい、変更した場合の影響範囲がわからなくなる。変更できないプログラムが出来上がっていく。

定数

変数と違い、一度代入した後、再度代入しようとすると警告される。
※警告であって、エラーでないので、代入自体はできてしまう。

条件判断

条件判断には主に下記3つの構文が使われる。 - if文 - unless文 - case文

Rubyの真偽値

  • false → falseとnil
  • true → 上記以外

論理演算子

条件1 && 条件2

条件1と条件2の両方がtrueのときにtrue

条件1 || 条件2

条件1か条件2のどちらかでもtrueであればtrue

!条件1

条件1がfalseのときにtrue

if文

単純な条件分岐

x = 10
if x >= 0 then
   print "0以上"
end

条件分岐を複数

条件を満たすものが見つかったときにその処理を実行する。
以降の条件は確認しない。

x = 10
if x >= 0 then
  print "0以上"
elsif x >= 10 then
  print "10以上"
else
  print "0未満"
end

unless文

条件がfalseのときに処理を実行

x = -1
unless x >= 0 then
  print "0未満です"
end 

case文

特定の変数をもとに処理を場合分けしたい場合に使う

x = 2
case x
when 0 then
  print "0です"
when 1 then
  print "1です"
when 2 then
  print "2です"
end

メソッドの作成

def say_hello
  print "Hello, World!\n"
end

say_hello()  # Hello, World!

別ファイルの取り込み

submodule.rb

def goodbye
  print "Good bye, World!\n"
end

playground.rb

# 別ファイルの読み込み
require "./submodule"

# 別ファイルにあるメソッドの実行
goodbye()

繰り返し

  • times
  • for
  • while
  • until
  • each
  • loop

timesメソッド

指定した回数だけ同じ処理をする

10.times do
  print "おはよう\n"
end
5.times do |i|
  print "さようなら(#{i})\n"
end

for文

iを1から100に変化させて、処理を行う

total = 0
for i in 1..100
  total += i
end
puts total

配列の要素を使って、繰り返し処理を行う

persons = ["田中", "山田", "佐藤"]
for person in persons
  puts person
end

while文

条件を満たしている間繰り返し処理を行う

total = 0
while total < 100 do
  total += 1
end
puts total

until文

条件を満たしていない間繰り返し処理を行う

total = 100
until total <= 0 do
  total -= 1
end
puts total

eachメソッド

配列や範囲から要素を取り出し、繰り返し処理を行う

persons = ["田中", "山田", "佐藤"]
persons.each do |person|
  puts person
end
total = 0
(1..100).each do |i|
  total += i
end
puts total

loopメソッド

繰り返し処理を行う。
繰り返し処理の中に終了条件を書き、繰り返しを抜けられるようにしておく

repeat_count = 0
loop do
  puts "よろしく"

  repeat_count += 1
  break if repeat_count > 5
end

break

繰り返し処理を終了する

persons = ["田中", "山田", "佐藤"]
persons.each do |person|
  puts person
  break if person == "山田"
end

next

次の繰り返し処理にスキップする

persons = ["田中", "山田", "佐藤"]
persons.each do |person|
  next if person == "山田"
  puts person
end

redo

繰り返し処理をやり直す

count = 0
persons = ["田中", "山田", "佐藤"]
persons.each do |person|
  count += 1
  puts person

  redo if count == 2
end

メソッド

メソッドの分類

インスタンスメソッド

インスタンスをレシーバとするメソッド

クラスメソッド

クラスをレシーバとするメソッド

関数

レシーバが省略できるメソッド

メソッドの定義

  • メソッド名にはアルファベット、数字、「_」を使うことができる。
  • メソッド名の先頭に数字を使うことはできない

クラスの中などに書かなければ、関数として定義される

def sayHello(name)
  puts "Hello, #{name}さん!"
end
sayHello("山田")

引数にデフォルト値を設定する

def hello(name = "World")
  puts "Hello, #{name}さん!"
end
hello()

メソッドの戻り値

メソッドの中でreturn文を使う

指定した数値を半分にして返す

def half(num = 0)
  return num / 2
end

puts half(100)

return文を省力できる。最後に得られた値が戻り値となる

def one_third(num = 0)
  num /3
end
puts one_third(99)

複数のパラメータをもつメソッド

def my_profile(name = "", hobby = "")
  puts "私の名前は#{name}です。\n趣味は#{hobby}です。"
end

my_profile("佐藤", "旅行")

ブロック付きメソッドの定義

ブロックで処理をするところでyieldを呼び出す

def repeat
  5.times do
    yield
  end
end

repeat do
  puts "さようなら"
end

引数の数が決まっていないメソッド

def hello(*names)
  names.each do |name|
    puts "#{name}さん、こんにちは"
  end
end

hello("田中", "佐藤", "山田")

キーワード引数

def my_profile(name:"", hobby:"", age: 0)
  puts "私の名前は#{name}です。\n趣味は#{hobby}で、#{age}歳です。"
end

my_profile(name: "渡辺", hobby:"旅行", age: 23)

定義に存在しないキーワード引数を指定してもエラーにしないようにする

def my_profile(name: "", hobby:"", age:0, **others)
  puts "私の名前は#{name}です。\n趣味は#{hobby}で、#{age}歳です。"
end

my_profile(name: "渡辺", hobby:"旅行", age: 23, sex:"male")