Ruby入門（ドットインストール）

# **はじめに**
ドットインストールのRuby入門の学習記録です。

# **目次**
- **破壊的メソッド､真偽値を返すメソッド**
- **%記法を使ってみよう**
- **ifで条件分岐をしてみよう**
- **真偽値と条件演算子**
- **caseで条件分岐をしてみよう**
- **times､while､break､nextを使おう**
- **for､eachを使おう**
- **関数的メソッドを作ってみよう**
- **クラスを作ってみよう**
- **クラスメソッド､クラス変数を使おう**
- **クラスを継承してみよう**
- **アクセサを使ってみよう**
- **Timeクラスを使ってみよう**

# **内容**
## **破壊的メソッド､真偽値を返すメソッド**
### **破壊的メソッド**
- 元データを書き換えたい場合に使うメソッド

```rb:通常
s = "taguchi"
puts s.upcase
puts s
```

```text:実行結果
TAGUCHI
tagchi
```

```rb:破壊的メソッドを用いた場合
s = "taguchi"
puts s.upcase!
puts s
```

```text:実行結果
TAGUCHI
TAGUCHI
```

### **真偽値を返すメソッド**
- 実行結果の真偽値を返したい時に使うメソッド
- 実行結果の真偽値は論理演算や条件判定で用いる

```rb
s = "taguchi"
p s.empty?
```

```text:実行結果
false
```

```rb
s = ""
p s.empty?
```

```text:実行結果
true
```

## **%記法を使ってみよう**
### **%記法とは**
- 文字列や配列の別の書き方

```rb:通常の書き方
# 文字列
s = "hello"
s = 'hello'

# 配列
a = ["a", "b", "c"]
a = ['a', 'b', 'b']
```

```rb:%記法の書き方
# 文字列
s = %Q(hello)
s = %q(hello)

# 配列
a = %W(a b c)
a = %w(a b c)

# 文字列を閉じる記号は記号であれば何でも良い（!, [, {, 等）
```

## **ifで条件分岐をしてみよう**
### **条件分岐**

```rb:通常のif文
score = 50
if score > 60
  puts "OK!"
elsif score == 60
  puts "NG!"
else
  puts "SOSO..."
end

# => SOSO...
```

```rb:省略した書き方
score = 50
puts "OK!" if score > 40

# => OK!
```

## **真偽値と条件演算子**
### **真偽値**
- falseになる場合
  - false　か nil（オブジェクトが存在しない）
- trueになる場合
  - それ以外（0, ' 'を含む）

```rb:if文での真偽値による条件分岐
x = 10
if x
  puts "True"
end

# 上記は下記の比較演算子を省略したもの

if x == true
  puts "True"
end
```

### **条件演算子**
- `if else`文を簡単に書けるようにするためのもの

```rb:条件演算子によるifelse文
b, c = 10, 20  # 多重代入
a = b > c ? c : b
puts a
```

```text:実行結果
20
```

## **caseで条件分岐をしてみよう**

```rb:case文による条件分岐
signal = "red"
case signal
  when "red"
    puts "STOP!"
  when "green", "blue"  # ,区切りで複数指定可能
    puts "GO!"
  when "yellow"
    puts "CAUTION!"
  else
    puts "wrong signal"
end
```

```text:実行結果
STOP!
```

## **times､while､break､nextを使おう**

```rb:timesメソッド
3.times do |i|    # doの後ろに適当な変数をつけると繰り返しの回数を取得できる
  puts "#{i}: hello"
end
```

```text:実行結果
0: hello
1: hello
2: hello
```

```rb:whileメソッド
i = 0
while i > 3 do
  puts "#{i}: hello"
end
```

```text:実行結果
0: hello
1: hello
2: hello
```

```rb:times+break
3.times do |i|    # doの後ろに適当な変数をつけると繰り返しの回数を取得できる
  if i == 1
    break
  end  
  puts "#{i}: hello"
end
```

```text:実行結果
0: hello
```

```rb:times+next
3.times do |i|    # doの後ろに適当な変数をつけると繰り返しの回数を取得できる
  if i == 1
    next
  end  
  puts "#{i}: hello"
end
```

```text:実行結果
0: hello
2: hello
```

## **for､eachを使おう**
```rb:for文
for i in 0..2
 puts i
end
```

```text:実行結果
0
1
2
```

```rb:for文（配列）
for color in ["red", "blue", "pink"]
  puts color
end
```

```text:実行結果
red
blue
pink
```

```rb:each文（配列）
["red", "blue", "pink"].each do |color|
  puts color
end
```

```text:実行結果
red
blue
pink
```

```rb:each文（ハッシュ）
{"apple"=>100, "banana"=>200, "orange"=>50}.each do |fruit, price|
  puts "#{fruit}: #{price}"
end
```

```text:実行結果
apple: 100
banana: 200
orange: 50
```

## **関数的メソッドを作ってみよう**
```rb:関数の作成
def sayHi
  puts "Hello"
end

sayHi()
```

```text:実行結果
Hello
```

```rb:引数の付与
def sayHi(name)
  puts "Hello" + name
end

sayHi("Tom")
```

```text:実行結果
Hello Tom
```

```rb:引数のデフォルト値設定
def sayHi(name = "Steve")
  puts "Hello" + name
end

sayHi("Tom")
sayHi()
```

```text:実行結果
Hello Tom
Hello Steve
```

```rb:返り値を持たせる
def sayHi(name)
  s = "Hello" + name
  return s    # returnは省略可能
end

greet = sayHi("Tom")    # 返り値があるので代入することが可能おｔなる
puts greet
puts s    # 定義されたメソッド外からの呼び出しはできない
```

```text:実行結果
Hello Tom
Error
```

## **クラスを作ってみよう**
#### **用語について**
- クラス
  - オブジェクトの設計図 
- インスタンス
  - クラスから作られたオブジェクト
- インスタンス変数
  - `@`から始まる変数
  - インスタンス内の別のメソッドから呼び出し可能

```rb:例1
class User()
  def initialize(name)
    @name = name
  end

  def sayHi()
    puts "Hello, my name is #{@name}" 
  end
end

tom = User.new("Tom")
bob = User.new("Bob")

tom.sayHi()
bob.sayHi()
``` 

```text:実行結果
Hello, my name is Tom
Hello, my name is Bob
```

## **クラスメソッド､クラス変数を使おう**
### **用語について**
- インスタンスメソッド
  - クラスの中で普通に定義されたメソッド
- クラスメソッド
  - クラスから直接呼び出すことができるメソッド
- クラス変数
  - `@@`から始まる変数
  - クラスメソッドから呼び出しできる変数

```rb:クラスメソッド、クラス変数
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

User.sayHello()

tom = User.new("Tom")
bob = User.new("Bob")

User.sayHello()
```

```text:実行結果
Hello from User class (0 users)
Hello from User class (2 users)
```

## **クラスを継承してみよう**

```rb:クラス継承
class User()
  def initialize(name)
    @name = name    # インスタンス変数
  end

  def sayHi()    # インスタンスメソッド
    puts "Hello, my name is #{@name}" 
  end
end

class SuperUser < User
  def shout
    puts "HELLO! from #{@name}!"
  end
end

tom = User.new("Tom")
bob = SuperUser.new("Bob")

tom.sayHi()
bob.sayHi()
bob.shout()
```

```text:実行結果
Hello, my name is Tom
Hello, my name is Bob
HELLO! from Bob
```

## **アクセサを使ってみよう**
### **用語について**
- アクセサ
  - 設定の取得
      - `getter`
  - 設定の変更
      - `setter`

```rb:セッター、ゲッターの定義
class User()
  def initialize(name)
    @name = name    # インスタンス変数
  end

  # インスタンス変数を外部から呼び出したり、変更したりする場合にゲッター、セッターを用いる
  # ゲッター
  def name
    @name    # return @name の return は省略可能
  end

  # セッター
  def setName(newName)
    @name = newName
  end

  def sayHi()    # インスタンスメソッド
    puts "Hello, my name is #{@name}" 
  end
end

bob = User.new("Bob")
bob.sayHi()
p bob.name
bob.setName("Tom")
bob.sayHi()
```

```text:実行結果
Hello, my name is Bob
"Bob"
Hello, my name is Tom
```

- このように簡単に書ける

```rb:セッター、ゲッターの定義
class User()
  def initialize(name)
    @name = name    # インスタンス変数
  end

  # ゲッター、セッターを両方定義
  attr_accessor :name
  # ゲッターのみを定義
  attr_reader :name
  # セッターのみを定義
  attr_writer :name

  def sayHi()    # インスタンスメソッド
    puts "Hello, my name is #{@name}" 
  end
end

bob = User.new("Bob")
bob.sayHi()
p bob.name
bob.name = "Tom"  # このように書ける
bob.sayHi()
```

```text:実行結果
Hello, my name is Bob
"Bob"
Hello, my name is Tom
```

## **Timeクラスを使ってみよう**
```rb:現在時刻の取得
t = Time.now
p t
```

```text:実行結果
2016-03-20 13:09:30 +0900
```

```rb:時刻指定＆時刻加算
t = Time.new(2016, 3, 20, 13, 09, 30)
p t
t += 10
p t
```

```text:実行結果
2016-03-20 13:09:30 +0900
2016-03-20 13:09:40 +0900
```

```rb:表示形式変更
t = Time.new(2016, 3, 20, 13, 09, 30)
p t.strftime("Updated: %Y-%m-%d")
p t
```

```text:実行結果
"Updated: 2016-03-22"
```