日々徒然

プログラミングしたりお酒飲んだりする毎日

RubyGold対策②

前回の記事

続きやってく。

refine

変更するクラスを与えるとusing以降から、その定義内容が反映されるみたい。

module内で定義する。

docs.ruby-lang.org

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無条件に読み込み、拡張子補完なし

docs.ruby-lang.org

るりまが言うにはこういうことらしい↓

require はライブラリのロード、load は設定ファイルの読み込みなどに使うのが典型的な用途です。

clone, dup

dupオブジェクトの内容をコピー

cloneは↑に加えてfreeze、特異メソッドなど完全なコピー

浅いコピーなので、深いコピーする時にはMarshalモジュールを使う

docs.ruby-lang.org

特殊変数

$0は実行中のファイル名

$1~$nは正規表現のn番目のカッコにマッチした文字列

分かりやすくまとめてくださってる方がいたので↓

Rubyの特殊変数一覧 · GitHub

lazy

遅延評価してくれるやつ

docs.ruby-lang.org

chunk

結果によってグループ分けしてくれるやつ

docs.ruby-lang.org

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
# => ふぁいばー
# => 停止

自分レベルのよわよわエンジニアにはイマイチ使いどころがわからん...

感想

知らない機能いっぱい...