ruby-on-rails - 如何在某些条件下覆盖红宝石宝石的方法?
问题描述
我试图仅在满足某些条件时才覆盖 gem 的私有方法之一。
我只想在满足特定条件时使用此方法,否则使用 gem 的方法。
module Net
class FTP
def makepasv
if condition
@sock.peeraddr[0] == 'AF_INET' ? parse229(sendcmd('EPSV')) : parse227(sendcmd('EPSV'))
else
super
end
end
end
end
解决方案
您可以prepend
覆盖被覆盖的类,然后使用条件。这样,您的模块将是祖先链中的最后一个,并且能够调用super
以使用默认行为
例如
module Override
def to_s(*)
if self == 'a'
"===a==="
else
super
end
end
end
String.prepend(Override)
[9] pry(main)> String.new("a")
=> "a"
[10] pry(main)> String.new("a").to_s
=> "===a==="
[11] pry(main)> String.new("b").to_s
=> "b"
推荐阅读
- mongodb - How to refer currently updating records in mongoDB query?
- angular - Error while migrating from Angular 7 to Angular 9
- php - How write PHP code for Curl - X Post commands
- go - Flatbuffer serialization performance is slow compared to protobuf
- c# - File Read.AllLines, but can user select file from console application?
- flutter - Flutter TextField Widget errorText未传递值
- python - elastic beanstalk上的自定义命令提示manage.py文件中的语法无效
- javascript - 用TypeScript取消useEffect的Async,正确的方法
- angular - 在使用 Jasmine 进行单元测试时,我应该模拟、监视或存根注入到组件中的服务吗?
- ios - PDF阅读器夜间模式