是否有更短的方法来实现以下目标?
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')
答案 0 :(得分:0)
这可能会节省一些换行符。我会保留换行符。
InvalidEmail = Class.new(RuntimeError) { attr_accessor :email; def to_s; "'#{@email}' is an invalid email"; end }