🦷

Ruby①

2023/02/04に公開

数値(Numeric)

このように数値を作ることができる

100
=>100
-50
=> -50
2.5
=> 2.5
-5.25
=> -5.25

四則演算

1 + 1
=> 2
10 - 1
=> 9
13 * 2
=> 26
100 / 5
=> 20

変数の手前にーをつけると数値の正と負を反転できる

x = 1

と宣言して

-x
=> -1

となる

割り算に関しての注意点!

  • 数値同士の割り算は整数になる
3 / 2
=> 1

1.5と表示されずに1と表示されてしまう

  • 小数点以下の数値が必要な場合はどちらかに小数点をつける
3.0 / 2
=> 1.5
3 / 2.0
1.5
3.0 /2.0
1.5

あまりは%で求められる!

10 % 3
=> 1

累乗

10 ** 3
=> 1000

整数を少数付きの数値に変換

Integerをfloatに変換

x = 3
=> 3

x.to_f
=> 3.0

to_fをつけることで小数点付きの数値に変更できる

x.to_f / 2
=> 1.5

x / 2
=> 1

割り算をした時に小数点以下の数値も欲しいときに便利!

数値オブジェクトが何のクラスか調べる方法

1.class
Integer
整数クラス

1.1.class
Float
小数点以下の数字が扱えるクラス

IntegerとFloatの大元はNumericクラス

1や1.1などの数値オブジェクトがどんなメソッドを持っているか確認する方法

**

メソッドとは

簡単にいうとクラスに所属する関数のようなもの

1.methods
Integer整数クラスが使えるメソッドが表示される
今の段階では何となくこういうことができるんだなくらいの理解でOK

文字列(String)

文字列は''または""で囲う

例えば

'abcdef'
=>"abcdef"
"abcdef"
=>"abcdef"

''で囲っても""で囲っても文字列としての違いはない
ただし、''と""で挙動が異なる点がある

文字列の中に特殊記号がある場合

例えば文字列の中に改行文字の\nを埋め込みたい場合""で囲う必要がある

puts "Ruby\nPrograming"
Ruby
Programing
=> nil

''で囲うとただの文字列として表示される

puts 'Ruby\nPrograming'
Ruby\nPrograming
=> nil

式展開の例

式展開とは
文字列の中で式や変数を展開することで文字列操作を
より簡単に少ないコード量で行えるもの

first_name = 'Hanako'
=> "Hanako"

last_name = 'Yamada'
=> "Yamada"

puts "My name is #{first_name} #{last_name}."
My name is Hanako Yamada.
=> nil

と表示される
(''で囲うと式展開は行われないので注意!)

まとめ:シングルクォートとダブルクォート使い分け

  • 特殊文字や式展開を使う時
    ダブルクォート""

  • それ以外のとき
    シングルクォート''

文字列の連結

+記号で行う

puts 'Taro' + 'Yamada'
TaroYamada
=> nil

スペースを開けることもできる

puts 'Taro' + ' ' + 'Yamada'
Taro Yamada
=> nil

文字列が入った状態での文字列連結もできる

puts first_name + ' ' + last_name
Hanako Yamada
=> nil

破壊的メソッド

アップケースメソッド
小文字を大文字にするメソッドの例

文字列を定義して
変数Sに入った文字列を大文字にして出力

s = 'Hello World!'
=> "Hello World!"

puts s.upcase
HELLO WORLD!
=> nil
 
puts s
Hello World!
=> nil

メソッドの最後に!をつけると、破壊的編集になる

puts s.upcase!
HELLO WORLD!
=> nil

puts s
HELLO WORLD!
=> nil

変数の内容まで書き換えられている!!!

文字列のクラスについて確認

'abc'.class
=>String

Stringクラスのオブジェクトということが確認できる

使えるメソッドは

'abc'.methods

と入力すると表示される

空白文字について

プログラムを書くとき、半角スペースタブ改行文字といった空白文字は
識別子や予約語を区切るために使うが、いくつ連続しても動作に違いはない

10 + 2 - 1
=>11
10+2-1
=>11
10     +    2    -    1
=>11

返ってくる結果としては一緒だが
コードを見やすくしてミスを減らすために
スペースは一つ開けて書くのが良い◎

演算子による値の比較

  • 2つの値の大小、同じ値かを調べる方法について
  • 関係が成り立つ場合は真(true)
  • 関係が成り立たない場合は儀(false)

irbを使って

1 < 2
=> true
1 <= 2
=> true
1 > 2
=> false
1 >= 2
=> false
1 == 1
=>true
1 != 2
=> true

このようになる!

演算子の優先順位

1.0 + 2.0 * 3.0 / 4.0
=> 2.5

順番はまず2*3が計算されてその値を4で割って
最後にその計算結果に1を足す

Rubyの演算子の優先順位はRubyのドキュメントの演算子式のページに記載ある
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html

(a && b) || c
このように()を使って計算の優先順位を指定することもできる

数値と文字列は暗黙的に変換されない

irbを使って

1 + '1'

このように数値と文字列を+演算子で加算することはできない
TypeErrorとなる

文字列を整数に変換するto_iメソッドを使う必要がある

1 + '1'.to_i
=> 2

少数の場合は.to_fメソッドを使う

1 + '1.1'.to_f
=> 2.1

反対のケースで文字列に数字を+演算子を使って連結することはできない

例えば

number = 1
=> 1

'Number is' + number

Typeerrorとなる

数値を文字列に変換する必要がある
to_sメソッドは数値を文字列に変換する

'Number is' + number.to_s
=> "Number is 1"

文字列を連結させることができた!

JSなどとは動作が異なるので注意!

インクリメントとデクリメント

インクリメント

  • 値に1を足す

デクリメント

  • 値から1を引く

= RubyにJavaScriptでいうところの++,--はない

インクリメントやデクリメントをしたいときは、、

irbを使って
まず、変数nを用意する

n = 1
=> 1

インクリメント

変数に1を足す方法
n++のような書き方はできないが、同様の書き方として

n += 1
=> 2

これでnに値を1プラスすることができる
ちなみに=>は

n = n + 1

と同じ意味

デクリメント

変数から値を1引く
これもn--のような書き方ができない

n -= 1 
=> 1
n = n - 1

と同じ意味
nに2が入っているので2−1で1になる

真偽値

真偽値とは

  • 真偽値は、命題の真偽を示す値

Rubyの真偽値のルール

  • falseまたはnilであれば偽(false)
  • それ以外は全て真(true)

真(true)となる例

  • trueそのもの
    true

  • 全ての数値
    1
    0
    -1

  • 全ての文字列
    'abc'
    'true'
    'false'
    ''空文字も

論理演算子

  • &&や||のような論理演算子を使うと、複数の条件を一つにまとめることができる

論理積と論理和

  • 論理積(and)
    a && b

aとbが共に真の場合に真

  • 論理和(or)
    a || b

aかbの少なくとも1つが真の場合に真

irbを使う

論理積(and) の例

t1 = true
=> true

t2 = true
=> true

f1 = false
=> false

t1 && t2
=> true

どちらもtrueなのでtrue

t1 && f1
=> false

f1がfalseなのでfalse

論理和(or)の例

変数を用意する

t1 = true
=> true

f1 = false
=> false

f2 = false
=> false

t1 || f1
=> true

t1がtrueなのでtrue

f1 || f2
=> false

両方ともfalseなのでfalseになる

真偽値の反転について

!演算子を使うと真偽値を反転できる

t1 = true
=> true

f1 = false
=> false

!t1
=> false

trueだったものが反転されてfalseに

!f1
=> true

falseだったものが反転されてtrueに

?メソッド

真偽値を返すメソッド

例えば文字列オブジェクトが空かどうかを調べるメソッド

name = 'Nakamura'
=> "Nakamura"

name.empty?
=> false
name = ' '
=> ""

name.empty?
=> true

文字列オブジェクトが空の場合はtrueとなる

include?メソッド

特定の文字が含まれているか調べる

例えば文字列の中にmが含まれているか調べる

name = 'Nakamura'
=> "Nakamura"

name.include?('m')
=> true

name.include?('z')
=> false

条件分岐if

条件分岐ifの構文

if 条件1
#条件1が真の場合に実行したい処理
elsif 条件2
#条件2が真の場合に実行したい処理
elsif 条件
#条件3が真の場合に実行したい処理
else
#それ以外の処理
end

補足
elsifという綴りに注意!!JavaScriptなどと異なる

elsifやelseは不要な場合、省略できる

if 条件 1
#条件1が真の場合に実行したい処理
end

例題①
テストの点数によって、通知表の成績をターミナルに出力するプログラム
90点以上A
80点以上B
60点以上C
60点未満D

score = 80
if score >= 90
  puts 'A'
  elsif score >= 80
    puts 'B'
    elsif score >= 60
      puts 'C'
    else
      puts 'D'
    end

ターミナルで成績を出力

    ruby if.rb

例題②
動物の種類によって、ターミナルに出力する鳴き方を変えるプログラム
'cat':'ニャー'
'dog':'ワン'
'chicken':'コケコッコー'
上記以外の場合:'鳴き声が登録されていません'

animal = 'cat'
if animal == 'cat'
  puts 'ニャー'
  elsif animal == 'dog'
    puts 'ワン'
    elsif animal == 'chicken'
      puts 'コケコッコー'
    else
      puts '鳴き声が登録されていません'
    end

条件分岐unless

条件分岐unless

  • unlessは、ifと反対の意味を持つ
  • 条件式が偽(false)になった場合、処理を実行します

構文unless

unless条件式
#条件式が偽(false)の時に実行したい処理
else
#条件式が偽(false)でない場合、つまり真(true)の時実行したい処理
end

elseが不要な時は、省略可能

unless条件
#条件式が偽(false)の時実行したい処理
end


変数nの値が0でなければ
'0ではありません'と出力するプログラムをunlessを使って記述してみましょう

n = 1
if !n.zero?
  puts '0ではありません'
end
unless n.zero?
  puts '0ではありません'
end

ifで書いた方もunlessで書いた方も
0ではありませんと出力される

0にすると成り立たないので出力されない

補足

  • elsifに相当するものはない
  • 無理にunlessを使う必要はない
  • 読みやすいと思う場合はifでOK

条件分岐case

構文条件分岐case

case対象のオブジェクトや式
when値1
#値1に一致する場合の処理
when値2
#値2に一致する場合の処理
when値3
#値3に一致する場合の処理
else
どの値とも一致しない場合の処理
end

補足
whenは任意の個数記述できる

caseを使うと
複数の条件を指定する場合は、elsifを重ねるよりも、caseで書いた方がシンプルで読みやすくなる

例題
誕生石から、誕生月を出力するプログラムをcaseで
ruby:7月
peridot:8月
sapphire:9月
それ以外:データが登録されていません

比較のためにifで書いた場合

stone = 'ruby'
if stone == 'ruby'
  puts '7月'
  elsif stone == 'peridot'
    puts '8月'
    elsif stone == 'sapphire'
      puts '9月'
    else
      puts 'データが登録されていません'
    end

ifで書くよりもcaseで書いた方が省略できる

stone = 'ruby'
case stone
when 'ruby'
  puts '7月'
  when 'peridot'
    puts '8月'
    when 'sapphire'
      puts '9月'
    else
      puts 'データが登録されていません'
    end

演習
条件分岐
年齢によって、テーマパークの入場料を出し分けてターミナルに出力するプログラム

仕様は下記とする
大人(12歳以上の者)5,000円
中人(6歳以上12歳未満の者)2,500円
小人(6歳未満の者)1,000円

条件分岐ifを利用する

age = 12
if age >= 12
  puts '5,000円'
  elsif age >= 6
    puts '2,500円'
  else
    puts '1,000円'
  end

メソッド

メソッドとは

  • 複数の処理を1つにまとめて、扱いやすくしたもの
  • (後のレクチャーで行うが)クラス内に定義される
  • (≒ クラス内で定義する関数)

構文 メソッド

def メソッド名(引数1,引数2・・・)
#実行したい処理
end

引数とは
メソッドの呼び出し元からメソッドに対して渡す特別な変数のこと

補足
defはdefineの略。defineは、定義するといった意味。

Hello World!と出力するプログラム

def hello_world
  puts 'Hello World!'
end

hello_world

メソッドに引数がないパターン

メソッドの命名規則について

  • メソッド名はスネークケースで書く
    hello_world
    単語と単語を_で繋ぐ

  • メソッド名に数字を入れることもできるが
    メソッド名の先頭に数字を入れるとエラーとなるので注意!

  • メソッド名のはじめに_を入れることはできるが
    実務上、一般的ではない!

二つの数字の足し算を行うメソッド
メソッド名addを作る

def add(a, b)
  a + b
end

puts add(10, 1)

10+1で11が表示される

メソッドの戻り値について

戻り値とは
メソッドから返す値のこと

JSなどでは戻り値をreturnで指定するがRubyでは不要
最後に評価された式がメソッドの戻り値になる

例題
動物の鳴き声によって、鳴き声を返すメソッドcryを作成
引数にcatが渡されたら戻り値'ニャー'
それ以外だったら戻り値'???'とする

def cry(animal)
  if animal == 'cat'
    'ニャー'
  else
    '???'
  end
end

puts cry('cat')

JSなどとは違うので違和感を感じるかもしれないが、
プログラムの記述量が減るので徐々に慣れていく!!

演習
FizzBuzz
エンジニアの採用試験で出ることもあるらしい!!

FizzBuzzメソッドの作成

  1. 3で割り切れる数値を引数に渡すと、'Fizz"を返す
  2. 5で割り切れる数値を引数に渡すと、'Buzz'を返す
  3. 15で割り切れる数値を引数に渡すと、'FizzBuzz'を返す
  4. それ以外の数値は、その数値を文字列に変えて返す。

補足

  1. メソッド名はfizz_buzzとする
  2. 引数名はnとする
  3. 引数nは1以上の整数が入る
  4. puts fizz_buzz(1)のようにして、メソッドを呼び出し、動作が正しいか確認してみましょう。数字は1〜15の範囲で確認してみる。

ファイル名
fizz_buzz.rb

回答

def fizz_buzz(n)
  if n % 15 == 0
    'FizzBuzz'
  elsif n % 3 == 0
    'Fizz'
  elsif n % 5 == 0
    'Buzz'
  else
    n.to_s
  end
  
end

puts fizz_buzz(1)
puts fizz_buzz(2)
puts fizz_buzz(3)
puts fizz_buzz(4)
puts fizz_buzz(5)
puts fizz_buzz(6)
puts fizz_buzz(7)
puts fizz_buzz(8)
puts fizz_buzz(9)
puts fizz_buzz(10)
puts fizz_buzz(11)
puts fizz_buzz(12)
puts fizz_buzz(13)
puts fizz_buzz(14)
puts fizz_buzz(15)

15は3でも5でも割り切れるので一番上に記入する!


rubyはやる必要ないって言われてたけど
やっぱり色んな言語に触れておくのは大事なんだと実感!
慣れてくるともっと楽しいんだろうな😄

Discussion