🛑

Ruby 模試問題 振り返り1回目

2022/03/10に公開

こんにちは。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)や特異メソッドを定義したオブジェクトはマーシャリングできないです。また無名のクラスやモジュールもマーシャリングできません。

逆にマーシャリングできるものは、ユーザーが作成したオブジェクトになります。

以下の記事を参照するとマーシャリングのイメージがつくかもしれません。
https://code-examples.net/ja/q/6424a

参考URL

Arrayオブジェクトについて
https://docs.ruby-lang.org/ja/latest/method/Array/s/new.html
DateTime
https://docs.ruby-lang.org/ja/latest/class/Rational.html

Discussion