リファレンスマニュアル
- とりあえずよく使うコマンドを見るようにすること
- 組み込みライブラリ
- 配列 : class Array
- 文字列 : class String
- ハッシュ : class Hash
- クラス・モジュールの継承リスト : module Enumerable
- 組み込みライブラリ
リファレンスから望みのメソッドを探す
- 「配列の中からランダムに要素を取り出したい」場合、
- リファレンスの
Array
のページを開く - ページ内検索
⌘ + F
で、試しにrandom
と打ってみる sample
メソッドが最初にヒットする- 例文などを見る限り、やりたいことを再現できそうと当たりをつける
- 実際に意図した挙動が得られるか確認する
- Array#sample (Ruby 3.1 リファレンスマニュアル)
p [1, 2, 3, "2", "3"].sample
オブジェクトのクラス
p "文字列".class # String
p 1.class # Integer
p [1].class # Array
p ({a: 1}).class # Hash
p :a.class # Symbol
p true.class # TrueClass
p false.class # FalseClass
p nil.class # NilClass
p self.class # Object
定数
- 定数名 : 先頭の 1 文字目は大文字
- すべて大文字も可
- 代入 → 2 回目に代入しようとすると
warning
が出る- 処理は実行されるが警告が出る
Fruit = "りんご"
puts Fruit
Fruit = "みかん"
puts Fruit
# a.rb:5: warning: already initialized constant Fruit
# a.rb:1: warning: previous definition of Fruit was here
りんご
みかん
コメント
# puts "これは無視される"
=begin
~=end
で囲んだ範囲はコメントアウトされる
puts 1
=begin
puts 2
puts 3
puts 4
=end
puts 5
# 1
# 5
メソッド
- メソッドを実行することを、メソッドを呼び出すとも言う
t = "hogehogehoge"
p t.length # 12
l = [1, 2, 3, 4]
p l.max # 4
fruits = ["apple", "banana", "grape", "peach"]
puts fruits.first # apple
puts fruits.last # peach
デバッグと p メソッド
- デバッグ
- プログラムの動作を確認し、バグを修復していくこと
p
メソッド- 変数の中身を確認する時などに使う、デバッグの基礎技術
puts
: 意図的に中身を表示させる際に使用p
: 原則的にデバッグの道具として使う
- 変数の中身を確認する時などに使う、デバッグの基礎技術
a = 3 / 2
b = a * 2
puts b # 2 ← 意図した答えは 3
- 怪しい箇所を
p
メソッドで検証
a = 3 / 2
p a # 1
b = a * 2
puts b # 2
- プログラムを修正して、デバッグ用の
p
メソッドを削除
a = 3.0 / 2
b = a * 2
puts b.to_i # 3
0 で割算 → エラー
p 5 / 0
# a.rb:1:in `/': divided by 0 (ZeroDivisionError)
# from a.rb:1:in `<main>'
メソッドチェーン
- メソッドを繋げて書く
l = [1, 2, 4]
p l.sum / l.size # 7 / 3 = 2
l = [1, 2, 4]
p l.sum # 7
p l.sum.to_f # 7.0
l = [1, 2, 4]
p l.sum.to_f / l.size # 2.3333333333333335
破壊的メソッド
l = [1, 2, 3, 2, 3, 5]
l1 = l.uniq
p l1
p l
# [1, 2, 3, 5]
# [1, 2, 3, 2, 3, 5]
l2 = l.uniq! # 元の配列が書き換えられる
p l2
p l
# [1, 2, 3, 5]
# [1, 2, 3, 5]
オブジェクト ID の違い
- 非破壊的メソッドでは、元のオブジェクトを元にした新たなオブジェクトを返す
- 元のオブジェクトは変わらない
x1 = [1, 2, 3, 2, 3, 5]
x2 = x1.uniq
p x1.object_id # 60
p x2.object_id # 80
- 破壊的メソッドでは、元のオブジェクトを変更した内容を返す
- 元のオブジェクトが変わる
y1 = [1, 2, 3, 2, 3, 5]
y2 = y1.uniq!
p y1.object_id # 100
p y2.object_id # 100 ← y1, y2 は同じオブジェクトを指している
元のオブジェクトを残しておく必要性の有無によって、使い分けが変わる
ブロックを渡せるメソッド
ブロックが与えられた場合、ブロックが返した値が重複した要素を取り除いた配列を返します。
p [1, 3, 2, "2", "3"].uniq # => [1, 3, 2, "2", "3"]
p [1, 3, 2, "2", "3"].uniq { |n| n.to_s } # => [1, 3, 2]
- ブロック
{ |n| n.to_s }
ブロックが与えられた場合
- メソッドの後ろにブロックを書いている場合のこと
- 「ブロックを渡す」とも表現する
- 「メソッドへ」「ブロックを渡している」イメージ
uniq
メソッドは、ブロックを渡す / 渡さないのどちらでも利用できる
- 「ブロックを渡す」とも表現する
- メソッドの後ろにブロックを書いている場合のこと