Ruby:动态创建具有值的类

时间:2017-11-02 20:50:07

标签: ruby

我在ruby应用程序中搜索一种简洁的方法来定义Exception依赖项。 以下是我想要处理的内容(以下示例不起作用):

def error_class(superclass, http_code_value)
  Class.new(superclass) do
    def http_code
      http_code_value
    end
  end
end

class AppError < StandardError
  def to_s
    "Here is my code: #{http_code}"
  end

  # other methods ...
end

# Clean error tree build
ClientError = error_class AppError, 400
ServerError = error_class AppError, 500
TeapotError = error_class ClientError, 418
# and so on ...

puts "client #{ClientError.new}" # client Here is my code: 400
puts "server #{ServerError.new}" # server Here is my code: 500
puts "teapot #{TeapotError.new}" # teapot Here is my code: 418

这里的问题是在类上下文中评估参数_http_code:它不存在。

有没有办法可以在不依赖eval的情况下实现它?

1 个答案:

答案 0 :(得分:4)

为获得正确的背景,这是一次非常小的改造:

def error_class(_superclass, _http_code)
  Class.new(_superclass) do
    define_method(:http_code) do
      _http_code
    end
  end
end

使用define_method时,默认情况下会在正确的上下文中创建它们。作为注释,这些变量并没有什么特别之处,因此应该抛弃_前缀。正如工程师指出的那样,_通常表示&#34;未使用&#34;,&#34;不重要&#34;或者&#34;不可避免的临时副本,我为此大声道歉&#34;。