今週のRuby (while、for, each , loop 〜クラスメソッドアクセサまで)

##今回の内容
1. while,timesを使う
2. for,eachを使う
3. loop, break, nextを使う
4. メソッドを作る。
5. クラスをつくる
6. アクセサを使う attr_, selfなど
7. クラスメソッド、クラス変数を使おう

##while,timesメソッドを使う

###while書き方
whileは他の言語でもおなじみ。
使いやすい。
条件書式付き文字が意外と便利なことに気づく。
> \#{1}

```ruby

i =0
while i < 10 do
 puts "#{i}:hello"
 i +=1
end

```

###timesメソッド
whileと機能としては一緒だが、回数がすでに決まっているときは便利な書き方。


 ```ruby
10.times do |i| #|i|をつけるとiを０からカウントしてくれる。特に見る必要性がなければ入れる必要性がない。
  puts "#{i}:hello"
end

```
iのカウント方法が独特で忘れそう。
あまり使う機会がなさそうだけど、表記自体が少なくて楽。


```ruby
10.times do 
　処理
end
```
ってとても楽

１行表記も可能。この場合はdoがいらなくて、{}で挟む必要性がある。

```ruby
10.times {|i| puts "#{i}:hello 短縮"}

```

##for,eachを使う

###forの書き方
```ruby
#i格納の場合
for i in 15..20 do
  p i
end

#配列の場合
for color in ["red","blue"] do
  p color
end

#ハッシュ表記の場合
for name, score in {taguchi:200, fkoji:400} do
  puts "#{name}: #{score}: "
end

```

##eachの書き方
for文はeachメソッドを実は使っているので、for文をeachで書き換えることが可能。
eachで１行表記なども可能。

```ruby
#each , forを書き換えることができる。
#i格納の場合
(15..20).each do |i|
  p i
end

#配列の場合
["red","blue"].each do |color|
  p color
end

#ハッシュ表記の場合
{taguchi:200, fkoji:400}.each do |name,score|
  puts "#{name}: #{score}: "
end

#ちなみに、１行表記も可能。
{taguchi:200, fkoji:400}.each{ |name,score|  puts "#{name}: #{score}: "}

```

##loop, break, nextを使う

###loopメソッド
ずっと繰り返しを行うメソッド。

```ruby
#loopの処理

i =0
loop do
  p i
  i += 1
end

#ctrl c を押すとloop止めれる。ターミナル上。

```
###break, next の書き方
```ruby 

#break: loopをぬけることができる。
#next : loopをスキップすることができる。

10.times do |i|
  if i == 7 then
    #break #ここで処理を抜ける
    next #ここで処理をスキップさせる。
  end
    p i
end

```

##メソッドを作る
メソッドを作る際の書き方。

```ruby
#メソッドを作る

#シンプルにメソッドを作る場合
def sayHi
  puts "hi!"
end

sayHi #メソッドsyaHiの呼び出し

#オプションを渡したい場合
def sayHi (name) #かっこをつける,引数

  puts "hi! #{name}"
end

sayHi("taguchi") #メソッドsyaHiの呼び出し
sayHi "taguchi" #（）は省略することが可能。

#引数にデフォルト値を与える。
def sayHi (name = "tom") #デフォルト値をつける。
  puts "hi! #{name}"
end

sayHi "taguchi"
sayHi #引数なしでもデフォルト値を返す


#メソッドに値を返してもらいたい場合
def sayHi (name = "tom") #デフォルト値をつける。
  #puts "hi! #{name}" #putsはなしでも大丈夫。
  return "hi! #{name}"
end

p sayHi

```
##クラスを作る

クラスをつくる書き方。

```ruby
##クラスを作る

#userクラスをつくる。

class User #クラス名は必ず大文字から始める。

  def initialize(name)
    @name = name #インスタンス変数 。 インスタンス変数は、インスタンス内ならば、どこでも使える。
  end

  def sayHi
    puts "hi! I am #{@name}" #インスタンス変数を用いる。
  end
end

#インスタンスを作る
tom = User.new("tom") #tomという変数をつくる。tomのインスタンスオブジェクト。
tom.sayHi  #tomのインスタンスオブジェクトで、sayHiメソッドを呼び出す。

bob = User.new("Bob")
bob.sayHi

```

##アクセサを使う
インスタンス変数をクラス外部でアクセスする方法。

>attr_accessor :name #コロン以降は、スペースは入れない。スペースも認識される。
\#setter : 値を設定する方のメソッドをセッターという。 #nameメソッド
\#getter : 値を取得する方のメソッドをゲッターという。

インスタンス変数を、attr_accessorでシンボルで渡してあげることで、外部からアクセスできるようになるらしい。

ゲッターだけ取得する方法もあるらしい。
> attr_reader :name #現状これをどのタイミングで使うのかはわからないけど。

```ruby
##クラスを作る

#userクラスをつくる。

class User #クラス名は必ず大文字から始める。

  attr_accessor :name
  #attr_reader: name #セッターのみを定義したい場合。

  def initialize(name)
    @name = name #インスタンス変数 。 インスタンス変数は、インスタンス内ならば、どこでも使える。
  end

  def sayHi
    puts "hi! I am #{@name}" #インスタンス変数を用いる。
  end
end

#インスタンスを作る
tom = User.new("tom") #tomという変数をつくる。tomのインスタンスオブジェクト。

tom.name = "tom.Jr"
p tom.name

tom.sayHi  #tomのインスタンスオブジェクトで、sayHiメソッドを呼び出す。

```

###selfを使う。

メソッド内で使える。
そのメソッドで使っているインスタンス自体をselfで表現できる。

メソッドを受け取っているオブジェクトのことを、レシーバーというらしい。


##まとめ
- マークアップ書式でメモを書くと、\#がマークアップと認識されることに気づく。条件つき書式を書くと#{~}と書く必要性があり、ややこしくなる。バックスラッシュ\ を毎回入れる必要性がある。
- アクセサあたりからよくわらなくなってきた。