>> 連載の目次は こちら!
##概要
- Rubyでは、全てのデータはオブジェクト。いわゆる基本データ型(プリミティブ型)というのは存在しない。
- なので、数値もオブジェクト。(整数はInteger 小数はFloat など)
- Rubyは動的型付け言語。同じ変数に違う型の値をセットできる
- Rubyでは、定数の扱いがやや(というかかなり)特殊
##1. 数値リテラルの話
Rubyでは数値リテラルもオブジェクト。(整数はInteger 小数はFloat など)
まあ、普通に 33 とか -22 とか 5.5 とか 0x2A とか書くわけだが...
いくつか特殊な表現がある。(あまり使わないかな...)
###アンダースコアで桁区切り
123_456_789 ← 普通に 123456789 のこと
###分数
1/3r ← 3分の1のこと
y = 99 * 1/3r ← 結果も分数になるので、y は 33/1(1分の33)になる
###その他
複素数 とかも表現があるらしいが、普通のWEBアプリとかでは使わないだろう。Python的に高度な計算を書きたいときに便利なのかな。
##2. 変数の話
###2-1. 普通に代入
myhen1 = 123
myhen2 = 999
myhen2 = 'aiueo' # 動的型付けなので、違う型の値をセットできる
###2-2. まとめて代入
x, y, z = 1, 2, 3 *1
a, b, c = [77, 88, 99] *2
*1 それぞれが左辺の対応する変数に代入される(この式の戻り値が 配列[1, 2, 3] ってところはユニーク)
*2 配列からまとめて代入もできる
##3. 演算
● 概要
まあ、普通に 3 + 2 とか 7 - 4 とか 5 * 6 とか 9 / 3 とか書く。
- もう少し高度な数学的な計算は、Mathモジュール(*)のメソッドで可能(sin とか cos とか sqrt とか)
- インクリメント演算子「++」やデクリメント演算子「--」は、Rubyには無い!
- べき乗は
**
演算子を使う。2 ** 3 ==> 8
(*)モジュールについては、後の回で書く予定です。
● 宇宙船演算子
左辺(レシーバー、つまり自分)が小さかったら -1
左辺(レシーバー、つまり自分)が大きかったら 1
左右が同じだったら 0
を返す
1 <=> 3 # -1
3 <=> 1 # 1
3 <=> 3 # 0
● 四捨五入
# 小数部をまるめる
p 1.4.round # 1
p 1.5.round # 2
p -1.4.round # -1
p -1.5.round # -2
# 小数点以下n桁の四捨五入
p 1.23456.round(2) # 1.23
p 1.23456.round(3) # 1.235
# 整数部をまるめる
p 123456.round(-2) # 123500
p 123456.round(-3) # 123000
● 切り捨て、切り上げ
# 切り捨て
p 1.4.floor # 1
p 1.5.floor # 1
p -1.4.floor # -2
p -1.5.floor # -2
# 切り上げ
p 1.4.ceil # 2
p 1.5.ceil # 2
p -1.4.ceil # -1
p -1.5.ceil # -1
● 小数点以下n桁の切り捨て、切り上げ
require 'bigdecimal'
# 小数点以下n桁の切り捨て
p BigDecimal(1.23001.to_s).floor(2).to_f # 1.23
p BigDecimal(1.23999.to_s).floor(2).to_f # 1.23
p BigDecimal(1.23401.to_s).floor(3).to_f # 1.234
p BigDecimal(1.23499.to_s).floor(3).to_f # 1.234
# 小数点以下n桁の切り上げ
p BigDecimal(1.23001.to_s).ceil(2).to_f # 1.24
p BigDecimal(1.23999.to_s).ceil(2).to_f # 1.24
p BigDecimal(1.23499.to_s).ceil(3).to_f # 1.235
p BigDecimal(1.23401.to_s).ceil(3).to_f # 1.235
● 絶対値
p (-5).abs # 5
##4. 定数の話
MYTEISU = 'aiueo'
まあ、普通にこう書くわけだが...
Rubyにおける定数は相当変わっている。ていうか、定数じゃないな、これ。やや特殊な扱いの変数か。
- 大文字ではじまっていたら定数として扱われる
- 再定義(別の値を代入)できる(!)。warningは出る。
- freeze で値を固定できる。(が、前述の再定義はやっぱりできちゃう)
- メソッド内では定数の定義ができない
MYTEISU = 123 # 定数を定義
MYTEISU = 'aiueo' # 再定義(別の値を代入)できる。warningになるだけ。
MYFROZEN = 'this is fixed!'.freeze # 凍結!
MYFROZEN.capitalize! # 中身を変更するメソッドがエラーになる
MYFROZEN = 999 # ただし、再定義(別の値を代入)は、やっぱりできる。warningになるだけ。
class Wao
def hello
TEISU = 99 # メソッド内ではdynamic constant assignment っていう例外が出る
puts y
end
end
##5. nil について
nilは真偽判断では、偽として扱われる(falseとnilだけが偽である)
●オブジェクトが nil かどうか知りたい
p str.nil?
●nil を判定して処理をする時
PHPでは isset とか色々判定が面倒だが(最近 NULL合体演算子 が使えるようになったけど)、Rubyでは、
・nilは偽として扱われる
・論理式の戻り値は、「最後に評価された式の値」
なので、以下のようにシンプルに書ける。
# nilだったらデフォルト値を代入
name = str || "anonymous"
# nilじゃなかったらなんかする
name = arr && arr.first