使用自定义消息创建自定义RuntimeError的最短方法?

时间:2017-02-07 01:38:33

标签: ruby

是否有更短的方法来实现以下目标?

 class InvalidEmail < RuntimeError
    def initialize(email) @email = email; end
    def to_s; "'#{@email}' is an invalid email"; end
 end

注意:自定义消息必须包含失败的电子邮件。

更新

@ fylooi的回答让我想到创建一个工厂类来实现我想要的东西。下面的客户端代码正是我想象的,尽管工厂实现可能会简化:

class CustomError
  def self.new(msg)
    Class.new(RuntimeError) do
      def initialize(*args)
        @args = args
      end
      define_method(:to_s) do
        @args.each.with_index.reduce(msg) do |m,(x,i)|
          m.gsub(Regexp.new("\\{#{i}}"), x)
        end
      end
    end
  end
end

# CLIENT CODE   
InvalidEmail = CustomError.new('"{0}" is an invalid email')

puts InvalidEmail.new('hi')

1 个答案:

答案 0 :(得分:0)

这可能会节省一些换行符。我会保留换行符。

InvalidEmail = Class.new(RuntimeError) { attr_accessor :email; def to_s; "'#{@email}' is an invalid email"; end }