如何用更合理的方法替换 add_entry 方法?
class MyStorageClass
def add_entry key, value
eval "(@#{key} ||= []) << value; def #{key}; @#{key}; end"
end
end
然后我可以按如下方式检索值:
def get_entry key
begin
self.send key.to_sym
rescue NoMethodError
nil
end
end
最佳答案
而不是每个键一个实例变量,这需要一些不必要的庞大代码,为什么不像下面那样只是一个哈希。此外,define_method
和 define_singleton_method
可以帮助您避免糟糕的 eval
。
class MyStorageClass
def initialize
@data = {}
end
def add_entry(key, value)
(@data[key] ||= []) << value
define_singleton_method(key){ @data[key] }
end
def get_entry(key)
@data.key?(key) or raise NoMethodError
@data[key]
end
end
您可能需要先检查您是否没有覆盖预定义方法(!@data.key?(key) && self.respond_to?(key)
在 add_entry
方法就可以),但那是另一个对话。如果有人试图添加一个名为 inspect
、class
或,哦,get_entry
的键,可能会很糟糕!
关于Ruby 动态创建方法和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37048802/