前回の記事
続きやってく。
refine
変更するクラスを与えるとusing
以降から、その定義内容が反映されるみたい。
module内で定義する。
class Piyo def cry puts "ぴよぴよ" end def call_cry cry end end module Hoge refine Piyo do def cry puts "ほげぴよぴよ" end end end piyo = Piyo.new piyo.cry # => ぴよぴよ using Hoge piyo.cry => ほげぴよぴよ piyo.call_cry => ぴよぴよ
クラスの中でusing
すると、そのクラス内での呼び出しはrefine
が使われるっぽい。
class Piyo def cry puts "ぴよぴよ" end def call_cry cry end end module Hoge refine Piyo do def cry puts "ほげぴよぴよ" end end end class HogePiyo using Hoge def call_cry Piyo.new.cry end end HogePiyo.new.call_cry # => "ほげぴよ" Piyo.new.cry # => "ぴよぴよ" using Hoge HogePiyo.new.call_cry # => "ほげぴよ" Piyo.new.cry # => "ほげぴよ"
require, load
require
は一度だけ読み込み、拡張子補完あり
load
は無条件に読み込み、拡張子補完なし
るりまが言うにはこういうことらしい↓
require はライブラリのロード、load は設定ファイルの読み込みなどに使うのが典型的な用途です。
clone, dup
dup
はオブジェクトの内容をコピー
clone
は↑に加えてfreeze、特異メソッドなど完全なコピー
浅いコピーなので、深いコピーする時にはMarshal
モジュールを使う
特殊変数
$0は実行中のファイル名
$1~$nは正規表現のn番目のカッコにマッチした文字列
分かりやすくまとめてくださってる方がいたので↓
lazy
遅延評価してくれるやつ
chunk
結果によってグループ分けしてくれるやつ
Fiber
本当に知らなかった機能No1
Fiber.new
にブロックを渡して処理を記述→resume
メソッドで実行する
fiber = Fiber.new do p "ふぁいばー" Fiber.yield # 処理を停止 p "ふぁいばー2" end fiber.resume # => ふぁいばー fiber = Fiber.new do p "ふぁいばー" Fiber.yield "停止"# 引数を渡すと、停止した時に返る p "ふぁいばー2" end p fiber.resume # => ふぁいばー # => 停止
自分レベルのよわよわエンジニアにはイマイチ使いどころがわからん...
感想
知らない機能いっぱい...