初心者のためのRuby入門

# まえがき
筆者はRuby初心者ですが、習得した基礎内容を共有したいと思います。
これからRubyを始める人への手助けになれば嬉しいです。

# Rubyとは
Rubyとは、まつもとゆきひろ氏により開発されたオブジェクト指向スクリプト言語です
一般にWEBアプリケーションの「システム」をつくるために用いられています。 

# 出力
puts "○○"というコードを書くと、putsの後の○○という文字がコンソールに出力されます。

```ruby:index.rb
puts "Hello World"
```

# 数値と計算
プログラミングでは、数値を扱うこともできます。
数値は文字列と違いクォーテーションで囲みません。
通常の算数のように足し算、引き算、掛け算、割り算を行うことができます。

```ruby:index.rb
puts 37 #数値
puts 2 + 9 #足し算
puts 2 - 9 #引き算
puts 13 * 9 #掛け算
puts 32 / 8 #割り算
puts 18 % 5 #割り算の余り
```

# 文字列の連結 
文字列同士に「+」記号を用いると、文字列同士を連結することができます。

```ruby:index.rb
puts "プログラミング言語は" + "Rubyです" 
```

# 変数
変数は「変数名 = 値」で定義します。
「=」は「等しい」という意味ではありません。
プログラミングの「=」は「左の変数に右の値を入れる」という意味でこれを代入といいます。

```ruby:index.rb
name = "ジョン"
number = 3
```

# 変数名のルール
変数名は自由に決めることができますが、Rubyではいくつか命名のルールがあります。
2語以上を組み合わせた変数名をつけるときは、アンダーバー（_）を用いるという習慣があります。

```ruby:index.rb
name = "ジョン" #○
user_name = "ジョン" #○

1name = "ジョン" #☓数字開始
namae = "ジョン" #△ローマ字
名前 = "ジョン" #△日本語
```

# 変数を文字列に含める
ダブルクォート(")で囲まれた文字列式、コマンド文 字列および正規表現の中では#{式}という形式で式 の内容(を文字列化したもの)を埋め込むことができます
これを「式展開」と呼びます。

```ruby:index.rb
length = 9 
width = 8
area = length * width
puts "面積は#{area}です"
```

# 式展開の注意点
シングルクォーテーションの場合は、式展開が行われず、そのまま文字列として出力されてしまうので注意しましょう。

```ruby:index.rb
name = "ジョン"
puts '私は#{name}です' #私は#{name}です と出力される
```

# 比較演算子
条件式に使った「>」は比較演算子と呼ばれる、大小比較の記号です。
「a < b」は、aの方がbより小さいときtrue, 大きいときfalseになります。
また「a <= b」とすると、aの方がbより小さいまたは等しい（つまりb以下）のときtrueになります。これは数学で用いる「≦」という記号と似ています。
「a == b」はaとbが等しければtrue、等しくなければfalseになります。
「a != b」はその逆です。

```ruby:index.rb
a < b #aの方がbより小さい時true
a <= b #aの方が小さいまたは等しいときtrue
a > b #aの方が大きいときtrue
a >= b #aの方が大きいまたは等しいときtrue
a == b #aとbが等しいときtrue
a != b #aとbが異なるときfalse
```

# 条件分岐
「score > 80」の部分は「変数scoreの値が80より大きい」という条件になります。
変数scoreにはいま94が代入されているので、この条件は成り立ち、処理が実行されています。
この場合条件が成り立たないときは何も実行されません。

```ruby:index.rb
score = 92
if score > 80
 puts "よくできました"
end
```

# 配列
複数の値をまとめて管理するには、配列というものを用います。
配列は[値1, 値2, 値3]のように作ります。
配列に入っているそれぞれの値のことを要素と呼びます。
配列を使うと、複数の文字列や数値をまとめて書くことができます。

```ruby:index.rb
names = ["Yamada", "Suzuki", "Sato"]
numbers = [10, 20, 30] 
```

# 配列の要素を用いる
配列の各要素は、配列[インデックス番号]とすることで用いることができます。(始まりは0)
names[1]とすると、配列namesの2つ目の要素の値を用いることができます。

```ruby:index.rb
names = ["Yamada", "Suzuki", "Sato"]
puts names[1] #Suzuki
```

# 繰り返し処理
繰り返し処理には、eachメソッドというものを使います。
eachメソッドを使うと、配列の要素を順番に取り出して処理を行うことができます。
eachメソッドは、「配列.each do |変数名|」と書き、「end」までの間に実行したい処理を書きます。

```ruby:index.rb
languages = ["日本語", "英語", "スペイン語"]
languages.each do |language|
  puts "#{language}を話せます"
end
```

# ハッシュ
ハッシュは、{キー1 => 値1, キー2 => 値2}のようにつくります。
配列は要素を[]で囲みましたが、ハッシュは{}で囲みます。キーと値の間は「=>」でつなぎます。また、配列と同様に、要素と要素はコンマ（,）で区切ります。

```ruby:index.rb
exam = {"subject" => "Math", "score" => 80}
```

# ハッシュの要素を更新する
ハッシュ[キー] = 値と書くことで、キーと対応している値を更新することができます。

```ruby:index.rb
exam = {"subject" => "Math", "score" => 80}
puts exam["subject"] #Math
exam["subject"] = "Science"
puts exam["subject"] #Science
```

# ハッシュに要素を追加する
ハッシュ[新しいキー] = 値と書くことで、ハッシュに新しい要素を追加することができます。
ただし、ハッシュにすでにあるキーを指定すると、要素の追加ではなく更新になってしまうので注意しましょう。

```ruby:index.rb
exam = {"subject" => "Math", "score" => 80}
exam["grade"] = "good" 
#exam{"subject" => "Math", "score" => 80, "grade" => "good"}
```

# シンボル
シンボルとは、文字を「"」や「'」で囲む代わりに、先頭に「:」をつけた書き方のことをいいます。
文字列とシンボルは厳密には異なりますが、基本的には同じように使用することができます。

```ruby:index.rb
puts "ruby"
puts :ruby
```

# キーがシンボルのハッシュ
ハッシュのキーにシンボルを用いるときには、省略した書き方をすることができます。
具体的には「:key =>」を「key:」というように省略することができます。
省略した書き方の場合でも、あくまでキーはシンボルですので、要素を取得する場合には以下のようにシンボルを用いる必要があります。

```ruby:index.rb
user = {name: "Suzuki", age:21}
puts user[:name]
```

# メソッド
「def メソッド名」と「end」の間に、まとめたい処理を書くことでメソッドをつくることができます。
このことを「メソッドを定義する」と言います。
メソッドは、定義するだけでは実行されません。
下のように、「メソッド名」とすることで実行できます。
メソッドを実行することを、「メソッドを呼び出す」と言います。

```ruby:index.rb
def introduce
  puts "こんにちは"
  puts "私はカズマです"
end
puts "-----自己紹介-----"
introduce
```

# 引数を受け取るメソッドの呼び出し
引数を渡してメソッドを呼び出すには、「メソッド名(値)」とします。
メソッドは、指定した値を受け取り、その値は引数に代入されます。

```ruby:index.rb
def introduce(name)
  puts "こんにちは"
  puts "私は#{name}です"
end
introduce("カズマ")
```

# 戻り値のあるメソッド
メソッドの中でreturnを使うと、呼び出し元で値を受け取れるようになります。
「return 値」と書くことで、メソッドはその値を戻り値として返します。

```ruby:index.rb
def discount(price)
 return price / 2
end
puts "テレビがセール中です！"
half_price = discount(15000)
puts "特別価格で#{half_price}円です"
```

# 真偽値を返すメソッド
if文で使うような条件式をreturnすると、その条件式の結果として得られる真偽値（trueまたはfalse）を返すことができます。
真偽値を返すメソッドは、メソッド名の末尾に「?」をつける慣習があるので、覚えておきましょう

```ruby:index.rb
def shipping_free?(price)
 return price >= 5000
end
if shipping_free?(3000)
 puts "5000円以上のお買い上げなので送料はいただきません"
else
 puts "追加で送料をいただきます"
end
```

# クラス
クラスは「class クラス名」とすることで定義できます。
クラス名は必ず大文字で始めることと、「end」を書く必要があることに注意しましょう。
情報を持たせるためには、「attr_accessor シンボル」のようにします。
下のようにすることで、Menuクラスのインスタンスにnameという情報を持たせることができます。
また、この「name」という情報のことをインスタンス変数と呼びますので覚えておきましょう。

```ruby:index.rb
class Menu
  attr_accessor :name
end
```

# インスタンスの生成
クラス（設計図）を元に、新しくインスタンスを生成するには、「クラス名.new」とします。
また、「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入することができます

```ruby:index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
end
menu1 = Menu.new
```

# インスタンス変数に値を代入する
インスタンスに情報をもたせるには、クラスで用意したインスタンス変数に値を代入する必要があります。
具体的には「インスタンス.変数名 = 値」とすることで、そのインスタンス変数に値をセットすることができます。

```ruby:index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
end
menu1 = Menu.new
menu1.name = "ピザ"
puts menu1.name
menu1.price = 800
puts menu1.price
```

# クラスの中で定義したメソッドを呼び出す
クラスの中で定義したメソッドは、インスタンスに対して使うようにして呼び出します。
具体的には、「インスタンス.メソッド名」のようにすることで、そのメソッドを呼び出すことができます。

```ruby:index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  def info
    puts "料理名と値段が表示されます"
  end
end
menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800
menu1.info
```

# インスタンスメソッド
インスタンスメソッドは、インスタンスに対して呼び出す、ということ以外は普通のメソッドと同じです。
したがって、インスタンスメソッドも、引数を受け取ったり戻り値を返すことができます

```ruby:index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  def show(data)
    puts "私は#{data}です。"
  end
end
menu1 = Menu.new
menu1.show("メニュー")
```

# インスタンスメソッドの中でインスタンス変数を扱う
インスタンスメソッドの中では、特殊な変数「self」を用いて「self.変数名」とすることで、インスタンス変数を扱うことができるようになります。
インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されています。

```ruby:index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  def info
    return "#{self.name} #{self.price}円"
  end
end
menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800
puts menu1.info
```

# initializeメソッド
インスタンスを生成した直後に処理を実行することができる、initializeメソッドがあります。
initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出されます。

```ruby:index.rb
class Menu
  attr_accessor :name
  attr_accessor :price
  def initialize
    self.name = "ピザ"
    self.price = 800
  end  
end
menu1 = Menu.new
```

# あとがき
今回はRuby初心者がRuby初心者のための記事を書きました。
紹介したものを含めたコードを[GitHub](https://github.com/oekazuma/ruby-lesson)にまとめたので併せて御覧ください。
少しでも学習の手助けになっていれば嬉しいです。
最後までお読みいただきありがとうございました。