2012-12-31 70 views
0

我有这样的代码:最简单的方法,从方法做一个哈希调用

class Foo 

    # (method definitions) 

    def make_hash 
    { 
     some_method: some_method, 
     some_other_method: some_other_method 
    } 
    end 

end 

我怎么能简化,或干燥,make_hash?我想要类似slice或Rails的attributes.slice,但适用于常规课程的方法。

回答

2

一种方法是用默认值块创建哈希:

def methods_hash 
    @methods_hash ||= Hash.new {|hash, key| hash[key] = self.class.instance_method(key) } 
end 

所以,每次请求的哈希的关键时候,它会动态加载instance_method,而不必前加载它所有。 instance_method方法返回对象,因此您可能需要.to_s.to_sym以满足您的需求。

虽然我对这个问题很感兴趣,并且很想知道你的最终目标是什么,

+0

谢谢。为了回答你的问题,我只想要一种序列化为公共JSON表示的方式,其中某些公共属性是内部方法结果,而不是属性。 – mahemoff

+0

实际上'to_json(methods:....)'也可能实现它,尽管这是JSON格式特有的。 – mahemoff

2

这样的事情会有所帮助。

mlist = {} 

Foo.instance_methods(false).each do |name| 
    mlist[name] = Foo.instance_method(name) 
end