2010-05-22 52 views
2

我想在Ruby中使用return_empty_set類方法,類似於attr_reader方法。我提出的實現是在Ruby元編程中避免class_eval

class Class 
    def return_empty_set *list 
    list.each do |x| 
     class_eval "def #{x}; Set.new; end" 
    end 
    end 
end 

和用法示例:

class Foo 
    return_empty_set :one 
end 
Foo.new.one # returns #<Set: {}> 

而是訴諸串看起來相當黑客。有沒有更清潔或更好的方式來寫這個,或許可以避免class_eval?或者這是最好的方式?

回答

6

使用define_method

class Module 
    def return_empty_set *names 
    names.each do |name| 
     define_method(name){Set.new} 
    end 
    end 
end 
+0

優秀的,謝謝。你是對的,它應該在'Module'下,因爲我可以'包含'這個功能。 – Peter 2010-05-22 18:55:22

+0

不知道這是否意味着什麼,但將它放在'Module'下的原因是,您可以在「模塊」定義(稍後包含)以及「類」中使用它。 – 2010-05-22 19:02:22

+0

是的,這就是我的意思。 – Peter 2010-05-23 04:10:29