除了使用closure和define_method之外还有其他方法吗?
说我有这个:
def test
result=[1,2,3]
metadata=['foo', 'bar'] # for simplicity, could be fetched from database
result.define_singleton_method :headers, lambda { metadata }
result
end
我很好奇,有没有其他方法可以嵌入,制作静态或好的,将元数据变量“复制”到Ruby中的方法中?
答案 0 :(得分:1)
我觉得定义这样的方法有点不合适(可能你应该有一个看起来像数组的对象,而不是让数组看起来像你的对象),但这也可以。
def test
result=[1,2,3]
result.instance_eval { @headers = ['foo', 'bar'] }
result.define_singleton_method(:headers) { @headers }
result
end
你也可以这样做(它有点不同,因为它也会创建一个setter)。
module HasHeaders
attr_accessor :headers
end
def test
result = [1,2,3].extend HasHeaders
result.headers = ['foo', 'bar']
result
end
答案 1 :(得分:0)
嗯,方法定义不是闭包,所以这不起作用:
def result.headers
metadata
end
由于您正在测试,我建议使用该方法。使用RSpec::Mocks
:
result.stub(:headers).and_return metadata
相关: