LoginSignup
1
3

More than 5 years have passed since last update.

[Ruby入門] 03.数値を扱う(リテラルと変数と演算。ついでに定数の話も)

Last updated at Posted at 2017-03-26

>> 連載の目次は こちら!

概要

  • 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
1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3