2012-04-02 62 views
1

有没有其他的方式使它成为另一种方式比封闭和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

你可以添加一些更多的代码,描述你想要什么?显示它与没有嵌入的东西有什么不同。 – 2012-04-02 23:16:28

+0

如果您需要简单的迭代功能,子类化数组或包含Enumerable模块的类还有什么用处? – 2012-04-02 23:32:03

+0

Andrew:由于范围不同,因此元数据变量在f.e.时未定义。像在Matherus Moreira中定义的答案或者定义def在body中的闭包,并且调用test.headers – 2012-04-02 23:46:09

回答

1

我觉得那种玄乎要定义这样的方法(可能是你应该有一个对象,它看起来像一个数组而比让数组看起来像你的对象),但这也会起作用。

def test 
    result=[1,2,3] 
    result.instance_eval { @headers = ['foo', 'bar'] } 
    result.define_singleton_method(:headers) { @headers } 
    result 
end 

你也可以做这样的事情(这是因为它创建了一个二传手,以及略有不同)。

module HasHeaders 
    attr_accessor :headers 
end 

def test 
    result = [1,2,3].extend HasHeaders 
    result.headers = ['foo', 'bar'] 
    result 
end 
+0

实例变量....非常好的主意,对我来说最好是使用Array(查询数据库)的结果和返回元数据的方法,而不是某些自定义类 – 2012-04-03 18:59:47

相关问题