チェリー本 2章 その3

fizz_buzzメソッドを作成する!

  • 3で割り切れる数値を引数に渡すと”Fizz”を返す
  • 5で割り切れる数値を引数に渡すと”Buzz”を返す
  • 15で割り切れる数値を引数に渡すと”FizzBuzz”を返す
  • それ以外はその数字を文字列で返す。

今までやってきたことのおさらい

def fizz_buzz(n)
  if n % 15 == 0  #15は3でも5でも割り切れるので一番上に記載すること。
    puts "fizz_buzz"
  elsif n % 5 == 0
    puts "Buzz"
  elsif n % 3 == 0
    puts "Fizz"
  else
    puts n.to_s
  end
end

fizz_buzz(1)
fizz_buzz(2)
fizz_buzz(3)
fizz_buzz(4)
fizz_buzz(5)
fizz_buzz(6)
fizz_buzz(15)

=>
h@poi: ~/ruby-book
$ ruby lib/fizz_buzz.rb
1
2
Fizz
4
Buzz
Fizz
fizz_buzz

fizz_buzzメソッドを作成する箇所は特に難しいと思ったところがないので次に行きます笑

%記法で文字列を作る

%記法を使うと””や’’でエスケープする必要がなくなります。

#%q!!を使った場合 シングルクォートで囲った事になる。

puts %q!hi!
=>hi

#%Q!!を使った場合 ダブルクォートで囲った事になる。式展開使用可能
x = "大文字Qの場合!"

puts %Q!#{x}!
=>
大文字Qの場合!

#%!!もダブルクォートで囲った事になる。

ヒアドキュメント(行思考文字列リテラル

長い文字列を使う場合スッキリする

a = <<Text ⇦識別子は自由に決めれる。
これはヒアドキュメントです。
複数行あるときに便利です。
Text
puts a

=>
h@poi: ~/ruby-book
$ ruby lib/fizz_buzz.rb
これはヒアドキュメントです。
複数行あるときに便利です。

フォーマットを指定して文字列を作る時

sprintfメソッドを使用すると
少数数第3位まで表示する文字列を作成することができる。

p sprintf("%0.3f", 1.2)

"フォーマット文字列%表示したいオブジェクト"の形式で書いても同じ効果が得ることができる。

p "%0.3f" % 1.2

=>
"1.200"

ここら辺はちょっと難しいので必要に応じてググります。笑
その他の文字列の作成について

#数字を文字列にする。
123.to_s
=>"123"

#配列を連結して一つの文字列にする。
p [10, 20, 30].join
=>"102030"

#String.newを使って新しい文字列を作る(あまり使わないらしい...)
p String.new("hello")
=>"hello"

rubyは文字と文字列の区別はないらしい...

他の言語は区別するらしいけど rubyは1文字でも2文字でも文字列(String)として扱われる。

真偽値と条件分岐について

&&や||の戻り値と評価を終了するタイミング
&&や||を使用した場合必ずしもtrueやfalseになるとは限らない

p 1 && 2 && 3

例えばこの式
戻り値は3になる

rubyは式全体が真または偽になるまで左辺から順に式を評価していく。
p 1 && 2 && 3の場合
全て真の為
最後に評価した値が帰ってくる。
一方で

p 1 && nil && 3
=> nil

の場合だとnilの時点で偽が確定する為
戻り値はnilになる ||の場合でも同じことが言える。

p false || nil || 3 || 2
=>3

orの場合だと真を評価した時点で戻り値がわかる

優先度が低い and ,or ,not

&& や|| や!に近いand,or,notがあるが
今まで特に意識することはなかったが
実は優先度が存在する。

[11] pry(main)> t1 = true
=> true
[12] pry(main)> f1 = false
=> false
[13] pry(main)> t1 and f1
=> false
[14] pry(main)> t1 or f1
=> true
[15] pry(main)> not t1
=> false

優先度が高い順

高 !  &&  || not andとor⇦同じ優先度 低
記号と英語の論理演算子を混ぜた場合結果が異なる

[16] pry(main)> !f1 || t1
=> true
[17] pry(main)> not f1 || t1
=> false

#次の式と同じことが言える
#優先度の関係で結果が異なる。

#!は||よりも優先度が高い
!(f1)||t1

#notは||よりも優先度が低い
not(f1||t1)

&&、||と異なりandとorは優先度に違いがない
()を使わない場合は左から右に真偽値が評価される。

pry(main)> t1 || t2 && f1
=> true
[21] pry(main)> t1 or t2 and f1
=> false

andとorっていつ使う??
andとorは条件分岐で使うのではなく
制御フローで扱うのに向いている
例えば...
「正常なユーザーであれば、そのユーザーにメールを送信する」といった架空のコードからメソッドを呼び出しに使ったもの
このままだと構文エラーになる。

user.valid? && send_mail_to user

#構文エラー
(user.valid?) && (end_mail_to) userのように認識されてしますため

andを使うとエラーにならない
user.valid? and send_mail_to user
(user.valid?) and (send_mail_to user)のように制御される為

続く...