🎩
Ruby Gold 練習問題2回目の振り返り
こんにちは。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
Discussion