Ruby 模試問題 振り返り1回目
こんにちは。WEBエンジニアのホリさんです。
今回が第8回目の記事です。
概要
Ruby 模試問題を解いてみて、業務でも使えそうだなと思ったものを共有させていただきます。
Array.new
Array.newは引数の指定の仕方によって、オブジェクトの扱いが異なります。
Array.new(3, "a")
長さ size の配列を生成し、同じオブジェクトを生成します。そのため、1つのオブジェクトを変更すると他のオブジェクトの値も変更されます。
ary = Array.new(3){"a"}
ary.first.upcase!
p ary
=> ["A", "A", "A"]
Array.new(3){"a"}
指定された配列を複製して返します。複製するため、同じオブジェクトではないため、1つのオブジェクトを変更しても他のオブジェクトの値も変更は変更されません。
ary = Array.new(3){"a"}
ary.first.upcase!
p ary
=> ["A", "a", "a"]
スーパークラスとサブクラス間のクラス変数
クラス変数はサブクラスまで共有されます。
そのため、スーパークラスからクラス変数を呼び出したときに、スーパークラスに定義しているクラス変数より、最終的にサブクラスに定義しているクラス変数が反映されます。
以下の場合だと、クラスBで定義している「3」が表示されます。
class A
@@x = 0
class << self
@@x = 1
def x
@@x
end
end
def x
@@x = 2
end
end
class B < A
@@x = 3
end
p A.x
=> 3
DateTime同士の計算
DateTime同士の計算は、有理数(Reation型)を扱うクラスとなります。
require "date"
d1 = Date.new(2022, 3 ,10)
d2 = Date.new(2022, 3 ,1)
p d1 - d2
=> (9/1)
※補足
Time同士は、少数点(Float型)になります
rescueのサブクラス
rescue Err1は、Err1とErr1のサブクラスの例外を対象とするため
以下のようにErr2がrescueされた場合、Err1の例外としても扱うことになる
class Err1 < StandardError; end
class Err2 < Err1; end
begin
raise Err2
rescue Err1 => ex
puts "Error"
end
=> Error
マーシャリングできないもの
マーシャリング・・・オブジェクトをファイル、DBなどに保存できる形式に変換、または変換を戻すことを指します。
オブジェクト(IO、File、Dir,Socket)や特異メソッドを定義したオブジェクトはマーシャリングできないです。また無名のクラスやモジュールもマーシャリングできません。
逆にマーシャリングできるものは、ユーザーが作成したオブジェクトになります。
以下の記事を参照するとマーシャリングのイメージがつくかもしれません。
参考URL
Arrayオブジェクトについて
DateTime
Discussion