抽象クラスで、具象クラスに提供して欲しいメソッドを記述するときに使えそう。 単なるraiseでRuntimeErrorを発生させるよりは、意図の分かりやすさとStandardErrorに含まれない点で良い。
class AbstractCollector
def collect
raise NotImpementedError, "Implement #{self.class}#collect"
end
end
$ gem i json_world | |
Fetching: json_world-0.2.2.gem (100%) | |
Successfully installed json_world-0.2.2 | |
1 gem installed | |
$ pry -r json_world | |
[1] pry(main)> class A | |
[1] pry(main)* include JsonWorld::DSL | |
[1] pry(main)* property(:x, type: Array, items: { type: String }) | |
[1] pry(main)* end | |
=> [#<JsonWorld::PropertyDefinition:0x007f9fffa9bb08 |
var _ = require('lodash'); | |
var Rx = require('rx'); | |
(function () { | |
/** | |
* @param {HTMLElement} element | |
* @return {Rx.Observable} | |
*/ | |
function createDeactivate$(element) { | |
return Rx.Observable.fromEvent(element, 'blur'); |
全てのメソッド呼出に対して何らかの処理を行うようなオブジェクトを生成したいとき、Rubyだと直接そういうオブジェクトを生成するようなクラスは用意されていないが、BasicObjectとmethod_missingを利用すれば簡単に作成できる。例えば、渡したloggerの全ての出力にタグを付けて欲しい場合にこの方法で解決しようとすると、こういう感じになる(この問題に対してのGoodな解決方法では無いです)。
class TaggingProxy < BasicObject
def initialize(target)
@target = target
end
def method_missing(name, message, *args, &block)
require "mac-event-monitor" | |
monitor = Mac::EventMonitor::Monitor.new | |
monitor.add_listener(:key_down) do |event| | |
system("afplay #{ENV['HOME']}/bin/sounds/#{event.keycode % 14 + 1}.wav &") | |
end | |
monitor.run |
it "returns an array of resources" do | |
get "https://api.github.com/resource" | |
response.body.should be_json([ | |
{ | |
"url" => /^https:/, | |
"id" => /^\d+$/, | |
"description" => /gist/, | |
"public" => true, | |
"user" => Hash, | |
"files" => Hash, |