Это называется «monkeypatching» и является именно тем случаем, для которого alias_method
был создан:
alias_method :original_mkdir, :mkdir
def mkdir(dirname)
begin
original_mkdir(dirname)
rescue FTPReplyError => e
raise unless e.message.start_with? '250 Directory created'
return ""
end
end
Хотя это часто встречающаяся «идиома» в Rubyэтот сломает существующий код (возможно, даже код внутри Net
), который опирается на mkdir
, вызывая исключение в этом случае.Вы не можете ограничить эти изменения только файлами, которые require 'net/ftp/forgiving'
.Таким образом, было бы гораздо проще создать подкласс, чем открывать исходный класс:
module Net
class ForgivingFTP < FTP
# mkdir that will accept a '250 Directory created' as a valid response
def mkdir(dirname)
begin
super(dirname)
rescue FTPReplyError => e
raise unless e.message.start_with? '250 Directory created'
return ""
end
end
end
end
Или, что еще лучше, поместите его в пользовательское пространство имен!Хорошее эмпирическое правило:
подкласс, когда возможно , monkeypatch, когда необходимо .
(Спасибо @tadmanза это).В этом случае в этом нет необходимости.
ОБНОВЛЕНИЕ: Если вы хотите добавить комментарий, если вы хотите расширить только конкретный экземпляр класса Net::FTP
, вы можете расширить его.их синглтон-классы:
obj = Net::FTP.new
class << obj
alias_method :original_mkdir, :mkdir
def mkdir(dirname)
#...
original_mkdir(dirname)
#...
end
end