Какова лучшая практика ruby для обработки ситуации, в которой объект должен не инициализироваться из-за того, что ему переданы недопустимые аргументы инициализации?
Я понимаю, что в ruby вводить утку означает, что мы не должныбыть чрезмерно озабоченным тем, какие типы переменных / параметров, а скорее заботиться о том, как они ведут себя.Тем не менее, я работаю в MacRuby, который соединен с API-интерфейсом Cocoa Objective-C, и некоторые методы Какао ожидают типизированных параметров.
Например, у меня есть класс ruby, который вызывает API Objective-C и должен передать ему объект класса 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 или есть более элегантное решение?Я нуб в рубине, поэтому предположим, что я подхожу к проблеме с неправильной точки зрения.