我想扩展 Proc 类,以便它的构造函数也可以采用参数散列,并将其转换为具有某些元编程构造的方法。大意是:
p = Proc.new(this: 100, that: 200, yes: 1, no: 2) { |arg| arg.even? }
p.call(1) # => false
p.this # => 100
p.yes # => 1
我想知道做这样的事情的红宝石方式。
我想扩展 Proc 类,以便它的构造函数也可以采用参数散列,并将其转换为具有某些元编程构造的方法。大意是:
p = Proc.new(this: 100, that: 200, yes: 1, no: 2) { |arg| arg.even? }
p.call(1) # => false
p.this # => 100
p.yes # => 1
我想知道做这样的事情的红宝石方式。
class Proc
def initialize h; @h = h end
def method_missing k; @h[k] end
def respond_to_missing?; true end
end
p = Proc.new(this: 100, that: 200, yes: 1, no: 2) { |arg| arg.even? }
p.call(1) # => false
p.this # => 100
p.yes # => 1
您可以(并且在这种情况下可能应该)通过实现和来让您自己的类表现得像 Proc 来完全避免猴子修补。例如,您可以从:to_proc
call
OpenStruct
require 'ostruct'
class MyFunkyClass < OpenStruct
def initialize(h, &block)
@block = block
super
end
def to_proc
@block
end
def call(*args)
@block.call(*args)
end
end
f = MyFunkyClass.new(this: 100, that: 200, yes: 1, no: 2) { |arg| arg.even? }
f.that # => 200
f.call(42) # => true
[1,2,3,4].select(&f) # => [2, 4]
没有元编程:
require 'ostruct'
r = OpenStruct.new(this: 100, that: 200, yes: 1, no: 2)
def r.call(n)
n.even?
end
p r.this # 100
p r.call(1) # false
编辑:@Marc-André Lafortune 对 Openstruct 有同样的想法;他的实现要好得多。