Ruby①
数値(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のドキュメントの演算子式のページに記載ある
(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メソッドの作成
- 3で割り切れる数値を引数に渡すと、'Fizz"を返す
- 5で割り切れる数値を引数に渡すと、'Buzz'を返す
- 15で割り切れる数値を引数に渡すと、'FizzBuzz'を返す
- それ以外の数値は、その数値を文字列に変えて返す。
補足
- メソッド名はfizz_buzzとする
- 引数名はnとする
- 引数nは1以上の整数が入る
- 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