Ruby 动态创建方法和变量

标签 ruby variables dynamic methods instance

如何用更合理的方法替换 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_methoddefine_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 方法就可以),但那是另一个对话。如果有人试图添加一个名为 inspectclass 或,哦,get_entry 的键,可能会很糟糕!

关于Ruby 动态创建方法和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37048802/

相关文章:

ruby-on-rails - Rails错误验证显示在字段下方

ruby-on-rails - 为什么我不能用 gem install rails -v 4.0.0 安装 rails?

ruby - 如何取消系统命令的执行

javascript - Javascript 中的返回值和变量范围

javascript - 通过方法动态改变元素数据

c++ - 尝试在 C++ 中使用动态数组推送值

ruby - 在 Ruby 中的 .each 循环中读取文件时移动到文件的最后一行

c - 如何解析字符长度变量?

JavaScript/CSS - 更新多个输入元素的值*和*大小

Java:通过不同的方法将元素添加到面板