Rubyまとめ

こんにちは。uniです。
今回は、「学習を始めて1週間ほどしか経ってない」くらいの初心者の方向けの記事です。
**辞書的な感じ**で使うことを想定しています。

## 変数
`x = 10` ←これ

データや値を格納しておくための箱のようなもの。
情報を一時的に保存したり、計算結果を保持できる。

#### 簡単な例文
```ruby
# 2つの数値を変数に格納する
num1 = 5
num2 = 10

# 変数を使って足し算を行う
sum = num1 + num2

# 結果を表示する
puts "合計: #{sum}"
```
上の
```ruby
num1 = 5
num2 = 10
```
のように、最初に変数に値を入れて明記することを「**変数を宣言する**」と言う



## 変数の定義の仕方
`変数名 = 値` ←こんな感じ

ここで迷うのが「変数名の付け方」。

#### 変数名の付け方
変数名のルールは以下の通り
- 数字で始めない(できない)
- 意味のある名前を付ける `(例: age（年齢）、name（名前）、count（個数）`
- 変数名は一意でなければならない

同じスコープ内(範囲)では同じ変数名を複数回使用することはできない。

#### いろんな値を入れられる
```ruby
name = "John"  # 文字列を代入
age = 25       # 数値を代入
is_student = true  # 真偽値を代入
```

## 文字列操作

#### 文字列とは
数字じゃないもの。要は単語。
```ruby
123 →　数字(これが数値)
一味 →　単語(これが文字列)
```

#### ダブルクォーテーション(")またはシングルクォーテーション(')で囲む

```ruby
123　→　数値
"一味"　→　文字列
"123" →　文字列
```

#### 簡単な例文
```ruby
name = "John"
puts name

#出力結果「john」
```

#### 文字列のいろいろ

##### 文字列の結合
```ruby
name = "John"
greeting = "Hello, " + name

puts greeting
#出力結果「Hello,John」
```

##### `.length`を使って、文字列の長さ(文字数)を取得
```ruby
name = "John"
puts name.length
#出力結果「4」
```

##### 演算子`[]`を使って、文字列の一部を取得
```ruby
name = "John"
puts name[0]
#出力結果「J」→123と数えるのではなく、012と数えるため
```

##### `sub`を使って、文字列の置換
```ruby
sentence = "I like apples"
new_sentence = sentence.sub("apples", "oranges")
puts new_sentence
#出力結果「I like oranges」
```

#### その他
`.length`とか`[]`とか`sub`とか、魔法のアイテムみたいなものを「**メソッド**」と言います。

## 配列
`fruits = ["apple", "banana", "orange"]` ←こんなやつ
複数の要素を順序付けして格納するデータ構造のこと。

#### 例
```ruby
fruits = ["apple", "banana", "orange"]
puts fruits[0]
＃出力結果「apple」
```
#### 配列の基礎
- 角かっこ [ ] 内に要素をカンマで区切って記述する
- 配列の要素は、0から始まるインデックス番号でアクセスできる
- 配列の要素は異なるデータ型でもOK

## データ型の種類
主要なデータ型は主に以下の通り。
- 文字列 (String)
- 数値 (Number)
- 真偽値 (Boolean)
- 配列 (Array)
- ハッシュ (Hash)

それぞれざっくり理解しましょう。

##### 文字列 (String)
文字の集まり。ダブルクォーテーション ("") やシングルクォーテーション ('') で囲まれたテキスト。
`例) "Hello,Ruby"`

##### 数値 (Number)
言葉どおり数値。`整数 (Integer)` と`浮動小数点数 (Float)` の2つの種類
- `整数(Integer)` → 正または負の整数値を表す (例： 5, -13)
- `浮動小数点数(Float)` → 小数点以下の値を持つ (例: 3.123, -0.4)

##### 真偽値 (Boolean)
真偽値は、論理値を表現するために使用される。 `true (真)`と `false (偽) `の2つの値がある。
条件式や制御フローで使用され、条件の成否やステートメントの実行可否を表す。

##### 配列 (Array)
複数の要素を順序付けて格納するために使用される。要素は任意のデータ型を持つことができ、角括弧 [] で囲まれ、カンマで区切られる。
例えば、[1, 2, 3] や ["りんご", "バナナ", "オレンジ"] のような形式。

##### ハッシュ (Hash)
ハッシュはキーと値のペアを持つデータ構造。キーは一意であり、値にアクセスするための識別子として機能する。ハッシュは波括弧 {} で囲まれ、キーと値はコロンで区切られる。

(例)
```ruby
person = { name: "John", age: 30, city: "Tokyo" }
book = { title: "Ruby Programming", author: "Alice Smith" }
```

## 条件分岐
ある条件に基づいてプログラムの実行フローを変更するための制御構造。
条件分岐には主に`if文`や`case文`が使われる。

`if文`
```ruby
age = 20

if age >= 18
  puts "成人です"
else
  puts "未成年です"
end
```
`case文`
```ruby
day = "Sunday"

case day
when "Monday"
  puts "月曜日です"
when "Tuesday"
  puts "火曜日です"
when "Wednesday"
  puts "水曜日です"
when "Thursday"
  puts "木曜日です"
when "Friday"
  puts "金曜日です"
when "Saturday"
  puts "土曜日です"
when "Sunday"
  puts "日曜日です"
else
  puts "不明な曜日です"
end
```


#### データ型「ハッシュ」と条件分岐を組み合わせるとこんな事ができる
```ruby
age = {
  "John" => 25,
  "Alice" => 17,
  "Michael" => 32
}

age.each do |name, years|
  if years >= 18
    puts "#{name}は成年です"
  else
    puts "#{name}は未成年です"
  end
end
```
`出力結果`
```
Johnは成年です
Aliceは未成年です
Michaelは成年です
```
## 繰り返し処理
名の通り、同じ処理を繰り返し実行するための制御構造。
Rubyでは主に`for`　`while`　`loop`が使われる。

`for`
for文は、指定した範囲や配列の要素に対して繰り返し処理を行う。
```ruby
for i in 0..4 do
  puts i
end
```

　`while`
指定した条件が真である限り、繰り返し処理を行う。
```ruby
i = 0
while i < 5 do
  puts i
  i += 1
end
```
`loop`
指定した条件が真である限り、無限に繰り返し処理を行う。
```ruby
i = 0
loop do
  puts i
  i += 1
  break if i == 5
end
```

## ブロック構文
`.each do |変数|`とかにある`do`です。
##### `do`ってなんやねん
`do`とは、ブロックを開始するためのものです。
```ruby
array.each do |item|
  puts item
end
```
この例だと、`array`という配列の要素を順番に取り出し、それぞれの要素に対してブロック内の処理が実行される。doとendの間にある部分がブロックで、`|item|`はブロックパラメータで、取り出した要素が代入される。

`do`を使用することで、メソッドの呼び出しとブロック内の処理を結びつけることが可能。これにより、メソッドに特定の動作を追加するなど、色んな用途のコードを記述することができる。

## メソッド
処理のまとまりのこと。
```ruby
def メソッド名(引数1, 引数2, ...)
  # 処理の記述
  # ...
  # 戻り値の指定 (オプション)
  return 戻り値
end

```
の`def~end`のこと。
再利用可能なコードブロックとして扱うための概念。
これを使えば何回も同じ処理を書かなくて済む。

ちなみにメソッドを呼び出すときは、以下例のようにメソッド名と必要な引数を指定する。
```ruby
result = メソッド名(引数1, 引数2, ...)
```

## メソッドの引数
メソッドに情報を渡すためのもの。
友達に「おすすめの本を教えて」と頼むときに、本のタイトルを伝えるような感じ。
```ruby
def recommend_book(friend_name, book_title)
  puts "#{friend_name}さんにおすすめの本は「#{book_title}」です！"
end

# メソッドを呼び出す
recommend_book("Alice", "ハリーポッターシリーズ")
recommend_book("Bob", "銀河鉄道の夜")

```
## メソッドの戻り値
メソッドが実行された結果として返される値のこと。
友達に頼まれて本を探してきたときに、友達がその本を受け取るような感じ。
```ruby
def find_book(title)
  # ここに本を探す処理を書く
  # 例えば、与えられたタイトルと一致する本を探す

  found_book = "『#{title}』"  # タイトルに一致する本を見つけたとする
  return found_book  # 友達に見つけた本を返す
end

# メソッドを呼び出す
book_title = "ハリー・ポッターと賢者の石"
book = find_book(book_title)
puts "友達に「#{book}」を見つけたよ！"  # 友達に見つけた本を渡す
```
## インスタンス
個々の特有の名前。
例えば「ポチ」「たろう」という二匹の柴犬がいた場合、`ポチ`と`たろう`がインスタンス。
```ruby
# 柴犬クラスの定義
class ShibaInu
  def initialize(name, age)
    @name = name
    @age = age
  end

  def bark
    puts "#{@name}がワンワンと吠えました！"
  end

  def introduce
    puts "私は#{@name}という柴犬で、#{@age}歳です。"
  end
end

# インスタンスの作成
pochi = ShibaInu.new("ポチ", 3)
taro = ShibaInu.new("タロウ", 5)

# インスタンスの操作
pochi.bark   # 出力: ポチがワンワンと吠えました！
taro.introduce  # 出力: 私はタロウという柴犬で、5歳です。
```
## インスタンスメソッドと呼び出し方
あるオブジェクト（インスタンス）に対して呼び出すことができるメソッドのこと。
上記例の
```ruby
pochi.bark   # 出力: ポチがワンワンと吠えました！
taro.introduce  # 出力: 私はタロウという柴犬で、5歳です。
```
の、`bark`と`introduce`がインスタンスメソッド。

## その他の基本的な構文や概念
### クラス
良く言われる例として`設計図`が挙げられる。
「クラスとは？」と言われても、もはや「設計図」としか答えられない。


面白いのが、クラスを定義すると「`initializeメソッド`を設けないといけない」ということ。
`initializeメソッド`は**初期化**を表す。
だからAlice,Bobの2人の教室(クラス)にMichaelが転校してきても、簡単に入学手続きができるということ。

```ruby
#クラスを定義
class Person
  def initialize(name, age, gender)
    @name = name
    @age = age
    @gender = gender
  end

  def walk
    puts "#{@name} is walking."
  end

  def talk(message)
    puts "#{@name} says: #{message}"
  end
end

#メソッドを定義
person1 = Person.new("Alice", 25, "Female")
person2 = Person.new("Bob", 30, "Male")
person3 = Person.new("Michael", 28, "Male")  # Michaelを追加

person1.walk
person2.talk("Hello!")
person3.walk  # Michaelが歩く
```