2

如果参数错误,如何取消对象创建?例子:

class MyClass
    def initialize(a, b, c)
        @a = @b = @c = nil
        @a = a if a.is_a? Integer
        @b = b if b.is_a? String
        @c = c if c.is_a? Integer or c.is_a? Float
        return nil if @a == nil or @b == nil or @c == nil # doesn't works
    end
end
cl = MyClass.new('str', 'some', 1.0) # need cl to be nil because 1st param isn't Integer
4

2 回答 2

4

这很简单,只是不要使用构造函数。:)

class MyClass
  def initialize(a, b, c)
    @a, @b, @c = a, b, c
  end

  def self.fabricate(a, b, c)
    aa = a if a.is_a? Integer
    bb = b if b.is_a? String
    cc = c if c.is_a? Integer || c.is_a? Float
    return nil unless aa && bb && cc
    new(aa, bb, cc)
  end
end

cl = MyClass.fabricate('str', 'some', 1.0) # => nil

顺便说一下,这种模式称为工厂方法。

于 2013-03-19T12:35:40.717 回答
1

除非您需要某种静默故障模式来处理不良数据,否则您可能只想引发错误并停止程序:

def initialize(a, b, c)
    @a = @b = @c = nil

    raise "First param to new is not an Integer" unless a.is_a? Integer
    @a = a

    raise "Second param to new is not a String" unless b.is_a? String
    @b = b

    raise "Third param to new is not an Integer or Float" unless c.is_a? Integer or c.is_a? Float
    @c = c
end

您是使用这种方法,还是使用传递错误输入的工厂方法取决于您希望使用的数据类型。

就个人而言,我几乎总是会提出错误,除非我有一个特定的要求来默默地忽略不良数据。但这是编码理念,不一定是您问题的最佳答案。

于 2013-03-19T13:01:51.893 回答