在新方法中“嵌入”或变量“静态”的其他方法?

时间:2012-04-02 22:56:07

标签: ruby closures

除了使用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中的方法中?

2 个答案:

答案 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

相关: