我想知道用 ruby 编写现有库的模块化扩展以改变现有方法的最佳方法是什么。它不应引入代码重复,应仅按需使用。
我试图完成的具体任务是扩展 ruby 的Net::FTP
模块以支持一些不太符合标准的服务器。这样的扩展应该与标准兼容库恕我直言完全分开。
我认为需要一个额外的文件会非常好,因为这甚至不会构成在原始代码中进行某种切换的必要性。因此,对于我们不太有天赋的 FTP 服务器研究员来说,额外的内容require 'net/ftp/forgiving'
将使原始库更加宽容。
然后,相关文件可以利用 ruby 的开放类和模块架构来修补 FTP 类。为了修复上面链接的古怪行为示例,我需要修补Net::FTP#mkdir
. 看起来像这样:
#content of net/ftp/forgiving
require 'net/ftp'
module Net
class FTP
# mkdir that will accept a '250 Directory created' as a valid response
def mkdir(dirname)
begin
original_mkdir(dirname)
rescue FTPReplyError => e
raise unless e.message.start_with? '250 Directory created'
return ""
end
end
end
end
然而,这需要以某种方式缓存原始代码Net::FTP#mkdir
以Net::FTP#original_mkdir
保持代码干燥。这可能吗?您对如何改进这种修补/扩展方法有任何进一步的建议吗?或者甚至可能完全不同的方法?