🎩

Ruby Gold 練習問題2回目の振り返り

2022/02/13に公開

こんにちは。WEBエンジニアのホリさんです。
今回が第5回目の記事です。

概要

Ruby Goldの問題2回目を解いて、初めて知ったことについて共有させていただきます。

文字列オブジェクトの変換

サイズ3の配列を生成すると、全て同じオブジェクトを参照することになるので、
aの値を変えると、以下のように["b", "b", "b"]と出力される

ary = Array.new(3, "a")
ary[0].next!
p ary

=> ["b", "b", "b"]

Thread

複数の処理を並行して実行させることができる

run
停止状態(stop)のスレッドを再開させます

new
スレッドを生成して、ブロックの評価を開始します

fork
newと違うところは、initialize メソッドを呼びません

extend

モジュール内のMethodを呼び出したいときに使用する

module M
 def hoge
  puts "hoge"
 end
end

class A
 extend M
end

A.hoge

StringIO

文字列に IO と同じインタフェースを持たせるためのクラス。

require "stringio"
sio = StringIO.new("hoge", 'r+')
p sio.read

=> "hoge"

コードブロックの呼び出し方

callメソッドで呼び出すことができます。引数はコードブロックの数に合わせて、設定します・

test = Test.new{|x,y| x + y }
puts test.call(1,2)
=> 3

freezeメソッドの参照変数

freezeメソッドはオブジェクトの内容を変更することを禁止していますが、参照変数自身は変更することができます。

array = [1,2,3].freeze
array += [4,5]
p array

=> [1,2,3,4,5]

破壊的メソッドの場合は以下の通りエラーになる

a2 = "foo".freeze
a2.replace("bar") # can't modify frozen String (FrozenError)

prepend

prependで取り込まれたメソッドは元から定義されていたメソッドより先に呼び出すことが可能になります。
またprependで呼び出されたモジュール内でsuperを呼び出すと、元から定義されたメソッドが呼び出される。

module Mod
  def foo
    puts "Mod"
    super
  end
end

class Test2
  def foo
    puts "test"
  end
end

class Test1 < Test2
  prepend Mod
end

Test1.new.foo

=>
"Mod"
"test"

マーシャリングとは?

オブジェクトをファイル、DBなどに保存できる形式に変換、または変換を戻すことを指します。
IOクラスや特異メソッドのオブジェクト、無名のクラス、モジュールはマーシャリングできないです。
自分で作成したオブジェクトはマーシャリングできます。

参考URL

https://docs.ruby-lang.org/ja/latest/method/Object/i/freeze.html

Discussion