Rubyコーディングの基本


Rubyとは
------

Rubyは、オブジェクト指向スクリプト言語で、1993年に日本人の[松本行弘](https://twitter.com/yukihiro_matz?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor)さんが作成した言語で、現在では世界中で利用されています。

基本構文
----

### コメント

行頭に`#`を記述することで、その行の末尾までコメントアウトされます。また、複数行をコメントアウトする場合は、`=begin`と`=end`で挟むことができます。

```ruby
# これはコメントです

=begin
これは
複数行
です
=end
```

### 変数

Rubyでは、変数名の前に`$`（グローバル変数）、`@`（インスタンス変数）、`@@`（クラス変数）をつけることができます。また、変数名はアルファベットまたは`_`（アンダースコア）で始める必要があります。変数に代入する値には、数値や文字列などがあります。

```ruby
x = 10          # ローカル変数
$y = "Hello"    # グローバル変数
@z = [1, 2, 3]  # インスタンス変数
@@w = 100       # クラス変数
```

### データ型

#### 文字列

文字列は`""`または`''`で囲みます。`""`だと式展開が行われます。

```ruby
name = "John"
age = 20
puts "My name is #{name}, and I'm #{age} years old."
```

#### 数値

整数や小数点以下の数値があります。四則演算や比較演算子が使えます。

```ruby
x = 10
y = 2.5
puts x + y      # 12.5
puts x - y      # 7.5
puts x * y      # 25.0
puts x / y      # 4.0
puts x % y      # 2.5
puts x > y      # true
puts x == y     # false
```

#### 配列

配列は`[]`で囲みます。配列中には、文字列や数値などの要素をカンマ区切りで列挙します。

```ruby
names = ["Alice", "Bob", "Charlie"]
ages = [20, 25, 30]
mixed = ["Alice", 20, "Bob", 25]

puts names[0]   # Alice
puts ages[1]    # 25
puts mixed[2]   # Bob
```

#### ハッシュ

ハッシュは`{}`で囲み、キーと値を`:`で区切ります。

```ruby
person = {name: "John", age: 20}

puts person[:name]  # John
puts person[:age]   # 20
```

### 制御文

#### 条件分岐

条件分岐は、`if`、`elsif`、`else`を使用します。また、`unless`を使用すると、条件が偽の場合に実行されます。

```ruby
x = 10

if x > 5
  puts "x is greater than 5."
elsif x < 5
  puts "x is less than 5."
else
  puts "x equals to 5."
end

unless x == 0
  puts "x is not zero."
end
```

#### 繰り返し

繰り返しは、`while`、`until`、`for in`、`each`などがあります。

```ruby
x = 0

while x < 5 do
  puts x
  x += 1
end

until x == 0 do
  puts x
  x -= 1
end

for i in 1..5 do 
```

### 関数/メソッド

Rubyで関数を定義するには、`def`キーワードを使用します。一般的な構文は以下の通りです。

```ruby
def 関数名(引数1, 引数2, ...)
  # 関数の実装
  戻り値
end
```

たとえば、引数 `x` と `y` を受け取り、それらの合計を返す `add` 関数を次のように定義できます。

```ruby
def add(x, y)
  x + y
end
```

複数の行にまたがる場合、コードブロックとインデントを使用して関数内でコードをグループ化します。例：

```ruby
def multiply(x, y)
  result = x * y  # 1行目
  if result > 100  # ２行目
    puts "Result is too big to handle!"
  else            # 3行目
    result
  end             # 4行目
end
```

これで、関数を定義しました。関数を呼び出すには、関数名に続いて括弧を使って引数を渡します。たとえば、`add` 関数を次のように呼び出すことができます。

```ruby
result = add(3, 5)    # 8を返す
```

### クラス

Rubyでクラスを定義する方法について説明します。

Rubyでは、`class`キーワードを使用してクラスを定義します。通常、クラス名は大文字から始めます。以下は、簡単なクラスの例です。

```ruby
class MyClass
  # コンストラクタ
  def initialize(name)
    @name = name
  end

  # インスタンスメソッド
  def hello
    puts "Hello, #{@name}!"
  end

  # インスタンス変数にアクセスするためのgetterメソッド
  def name
    @name
  end
end
```

このクラスは`MyClass`という名前で定義されています。コンストラクタは`initialize`メソッドで、引数として名前を受け取り、インスタンス変数`@name`に設定します。

`hello`という名前のインスタンスメソッドが定義されており、メッセージを出力します。`name`という名前のgetterメソッドがあります。これを使用して、インスタンス変数`@name`にアクセスできます。

クラスを使用する場合、新しいインスタンスを作成する必要があります。以下は、その例です。

```ruby
obj = MyClass.new('Alice')
obj.hello  #=> Hello, Alice!
puts obj.name  #=> Alice
```

`new`メソッドを使用してクラスから新しいインスタンスを作成し、`hello`メソッドを呼び出しています。また、getterメソッド`name`を使用して`@name`にアクセスしています。

以上が、Rubyでクラスを定義する方法です。

### 定数

Rubyで定数を定義するには、`CONSTANT_NAME = value`の形式でコードを書きます。定数名は大文字で、アンダースコアで単語を区切ります。

例えば、「PI」という円周率の値を定数として定義する場合、以下のように書きます。

```ruby
PI = 3.141592
```

また、Rubyの定数は再代入不可であるため、警告無しに再代入すると警告が発生します。

```ruby
PI = 3.14       # 再代入

# 実行結果
warning: already initialized constant PI
warning: previous definition of PI was here
```

しかし、`Object.freeze`メソッドを使用して定数を凍結することができます。これにより、警告なしに再代入するとエラーとなります。

```ruby
# 定数を凍結する
MY_CONSTANT = Object.freeze('Hello World!')

# 再代入しようとする
MY_CONSTANT = 'Another string'

# 実行結果
raise frozen error (FrozenError)
```

### モジュール
Rubyでモジュールを定義するには、`module`キーワードを使用します。以下は例です。

```ruby
module MyModule
  def greet
    puts "Hello World!"
  end
end

class MyClass
  include MyModule
end

obj = MyClass.new
obj.greet #=> Hello World!
```

上記の例では、`MyModule`モジュールに`greet`メソッドが定義されており、`MyClass`クラスでこのモジュールをインクルードしています。そして、`MyClass`のインスタンス`obj`で、`MyModule`内で定義された`greet`メソッドが呼び出されています。

### privateメソッド

Rubyでprivateメソッドを定義するためには、`private`キーワードを使用します。以下は例です。

```ruby
class MyClass
  def public_method
    puts "This is a public method."
  end

  private

  def private_method
    puts "This is a private method."
  end
end
```

上記の例では、`private_method`はprivateメソッドとして定義されています。クラス内からは呼び出すことができますが、インスタンスメソッドとしては使えません。

また、`public`キーワードが明示されていない場合、Rubyクラスで定義されたメソッドはデフォルトでpublicメソッドとして定義されます。

### 例外処理

Rubyでは、try-catch構文の代わりに、begin-rescue構文を使用します。以下は、例外が発生したときにエラーメッセージを表示する例です。

```ruby
begin
  # Try some code that might fail.
  result = 10 / 0
rescue ZeroDivisionError => e
  # Handle the error gracefully.
  puts "Error: #{e.message}"
end
```

この例では、`begin`ブロック内のコードが実行されます。ここで、`result = 10 / 0`は、ゼロによる除算を試みる危険なコードです。したがって、この行でZeroDivisionErrorが発生し、アクティブなメソッドから呼び出された場所にthrowされます。

Rubyは、あなたがハンドルするために異なる種類のエラーを提供しています。あなたは、警告や失敗したオブジェクトをcatchできます。それに応じて適当にハンドリングすることができます。

## Rubyで扱える主なデータ型

*   Integer: 整数値を表します。例えば、`30`, `-42`などが代表的なIntegerです。
*   Float: 浮動小数点数を表します。例えば、`3.14`, `2.718`などが代表的なFloatです。
*   String: 文字列を表します。文字列は、シングルクォーテーション(`'`)かダブルクォーテーション(`"`)で囲みます。例えば、`"hello world"`や`'こんにちは'`がStringです。
*   Boolean: 真偽値を表します。`true`または`false`の二つの値を取ります。略して`true/false`または`T/F`と書くこともあります。
*   Array: 配列を表します。複数の値を格納することができ、添字を指定することで要素を取り出せます。例えば、`[1, 2, 3]`や`["apple", "orange", "banana"]`がArrayです。
*   Hash: ハッシュを表します。キーと値のペアを複数格納し、特定のキーに対応する値を取り出すことができます。例えば、`{ "name" => "Alice", "age" => 20 }`がHashです。

以上が、Rubyで扱える主なデータ型になります。


## Arrayの主なメソッドと利用例

### \[\] と \[\]=

`[]` メソッドは、配列のインデックスに対応する要素を取得するために使用されます。`[]=` メソッドは、同じくインデックスに対応する要素を置き換えるために使用されます。

```ruby
arr = [1, 2, 3]
arr[0] #=> 1
arr[1] = "apple"
arr #=> [1, "apple", 3]
```

### push

`push` メソッドは、配列の末尾に要素を追加するために使用されます。

```ruby
arr = [1, 2, 3]
arr.push(4)
arr #=> [1, 2, 3, 4]
```

### pop

`pop` メソッドは、配列の末尾から要素を削除して返すために使用されます。

```ruby
arr = [1, 2, 3]
arr.pop #=> 3
arr #=> [1, 2]
```

### unshift

`unshift` メソッドは、配列の先頭に要素を追加するために使用されます。

```ruby
arr = [1, 2, 3]
arr.unshift(0)
arr #=> [0, 1, 2, 3]
```

### shift

`shift` メソッドは、配列の先頭から要素を削除して返すために使用されます。

```ruby
arr = [1, 2, 3]
arr.shift #=> 1
arr #=> [2, 3]
```

### join

`join` メソッドは、配列の要素を区切り文字で連結して文字列を生成するために使用されます。

```ruby
arr = ["apple", "orange", "banana"]
arr.join(", ") #=> "apple, orange, banana"
```

### sort

`sort` メソッドは、配列の要素をソートして返すために使用されます。

```ruby
arr = [5, 2, 8, 1, 9]
arr.sort #=> [1, 2, 5, 8, 9]
```

これら以外にも、Arrayクラスには様々なメソッドがあります。詳細は公式ドキュメントを参照してください。
https://docs.ruby-lang.org/ja/latest/class/Array.html


## Stringの主なメソッドと利用例

### length
文字列の長さを返します。
```ruby
str = "Hello, World!"
p str.length   # => 13
```
    
### upcase
文字列を大文字に変換します。
    
```ruby
str = "hello"
p str.upcase   # => "HELLO"
```
    
### downcase
文字列を小文字に変換します。
    
```ruby
str = "HELLO"
p str.downcase   # => "hello"
```
    
### capitalize
最初の文字だけを大文字に変換します。
    
```ruby
str = "hello, world!"
p str.capitalize   # => "Hello, world!"
```
    
### reverse
文字列を逆順にします。
    
```ruby
str = "hello"
p str.reverse   # => "olleh"
```
    
### slice
文字列の一部分を取り出します。
```ruby
str = "hello, world!"
p str.slice(0, 5)   # => "hello"
```

これら以外にも、Stringクラスには様々なメソッドがあります。詳細は公式ドキュメントを参照してください。

https://docs.ruby-lang.org/ja/latest/class/String.html

## HTTPリクエスト
以下はRubyでHTTPリクエストを送信する例です。

```ruby
require 'net/http'

url = URI.parse('https://example.com/path/to/resource') # リクエスト先のURLを指定

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true # SSL/TLS通信を行う場合、trueを指定

request = Net::HTTP::Get.new(url) # GET/POSTなどのリクエストメソッドを指定

response = http.request(request) # リクエストを送信し、レスポンスを受け取る

puts response.body # レスポンスボディの内容を出力
```

この例では、HTTPSでリクエストを送信する場合に対応するために、`use_ssl`属性を`true`に設定しています。また、リクエストメソッドとして`GET`を使用していますが、必要に応じて他のメソッド（例：`POST`）を使用することができます。

この例では`Net::HTTP`を使用してHTTPリクエストを処理していますが、この他にもRubyのHTTPクライアントライブラリとして、`HTTParty`や`Faraday`、`Typhoeus`等があります。それぞれ異なる特徴や利用方法があるため、目的や環境に合わせて選択してください。

# Gemとは
Gemとは、Rubyプログラミング言語で使用できる様々なライブラリやアプリケーションをパッケージ化された形式です。

具体的には、以下のような用途で使用することができます。

他の開発者が作成したコードを再利用する
自分のコードをパッケージ化して公開する
代表的なGem管理システムとして「Bundler」があります。Bundlerを使うことで、自分が書いたコードや外部のライブラリ(Gem)の依存関係を自動で解決し、環境を整備することができます。

また、より多くのGemを探すために、以下のようなサイトを活用することもできます。

https://rubygems.org/
https://github.com/
http://www.ruby-toolbox.com/

# Railsとは
Railsは、Webアプリケーションを構築するためのオープンソースのフルスタックWebアプリケーションフレームワークであり、Ruby言語で記述されています。Railsには、モデル（アプリケーションのデータ）、ビュー（アプリケーションのUI）およびコントローラ（アプリケーションのロジック）をうまく統合するための多数のライブラリやツールが用意されており、開発者がアプリケーションの特定の側面に集中しやすくなっています。Railsにより、開発者は迅速に高品質かつ安全なWebアプリケーションを開発することができます。