处理由于传递了无效的初始化参数而导致对象无法初始化的情况的 ruby 最佳实践是什么?
我意识到在 ruby 中,鸭子类型意味着我们不应该过度关注变量/参数的类型,而是关注它们的行为方式。但是,我在 MacRuby 中工作,它通过 Cocoa Objective-C API 桥接,一些 Cocoa 方法需要类型化参数。
例如,我有一个调用 Objective-C API 的 ruby 类,并且必须将 NSURL 类的对象传递给它。它看起来像这样:
class Alpha
attr_accessor :model
def initialize(hopefully_a_NSURL)
# bridged from Objective-C API
@model=NSManagedObjectModel.alloc.initWithContentsOfURL(hopefully_a_NSURL)
end # initialize
end
...我会这样称呼它:
#bridged from Objective-C API
u=NSURL.fileURLWithPath(p)
a=Alpha.new(u)
puts "a=#{a.model}" # => a=#<NSManagedObjectModel:0x2004970e0
>
...效果很好。
但是,如果我滑倒:
a=Alpha.new("Whoops, a string not a NSURL" )
...它因来自 Objective-C API 深处的错误而混乱地爆炸。
当然,我可以进行测试以防止错误参数到达桥接对象:
class Alpha
attr_accessor :model
def initialize(hopefully_a_NSURL)
if hopefully_a_NSURL.class==NSURL
@model=NSManagedObjectModel.alloc.initWithContentsOfURL(hopefully_a_NSURL)
end
end # initialize
end
u=NSURL.fileURLWithPath(p)
a=Alpha.new("")
puts "a=#{a}" # => a=#<Alpha:0x200399160>
...但我仍然得到一个实时实例。我什至尝试从初始化返回 nil 但似乎 ruby 坚持总是返回一个活动实例。
我读过的所有内容都表明,在 ruby 中类型检查非常不受欢迎,但在 MacRuby 的情况下,我可能不得不破例。这是在 ruby 中很好地使用异常还是有更优雅的解决方案?我是红宝石的菜鸟,所以假设我从错误的角度处理问题。