ruby - 我可以以惯用/简洁的方式使这种“块包装”成为可选吗?
问题描述
在 ruby 中,您可以像这样调用远程 api
def get_remote_date
Net::HTTP.get('example.com', '/index.json')
end
如果你这样做gem install vcr
,你可以这样做
def get_remote_date
VCR.use_cassette("cassette_001") do
Net::HTTP.get('example.com', '/index.json')
end
end
当远程 api 很昂贵时,Vcr 录制/播放在开发过程中很有帮助。是否使用 vcr 应该是可选的,由函数的第一个参数指示:
def get_remote_date(should_use_vcr)
VCR.use_cassette("cassette_001") do
Net::HTTP.get('example.com', '/index.json')
end
end
我的问题是,如何重写该方法,以便“块包装”/“VCR.use_cassette("cassette_001") do”取决于 should_use_vcr 局部变量的布尔值。
我可以
def get_remote_date(should_use_vcr)
if conditional here
VCR.use_cassette("cassette_001") do
Net::HTTP.get('example.com', '/index.json')
end
else
Net::HTTP.get('example.com', '/index.json')
end
end
但是对于具有“Net::HTTP.get(”加上十几行的复杂方法,代码重复太多,因此寻找一种更简洁的方法来完成它。
解决方案
您可以尝试使用以下方法:
def get_remote_date
record_request { Net::HTTP.get('example.com', '/index.json') }
end
def record_request(&request)
ENV['RECORD_REQUEST'] ? VCR.use_cassette("cassette_001", &request) : request.call
end
这是一篇不错的文章,它解释了&block
(与号参数)的含义以及它与yield
关键字的关系。
推荐阅读
- react-native - 反应本机图表套件响应不起作用
- database - 有没有人可以帮我解决在oracle 19c上导入dmp文件的问题
- javascript - 我如何检查两个数字是否以相同的数字开头Javascript
- r - r ggplot如何调整bar的列宽
- r - 如果 dplyr 的参数不为空,则使用函数参数有条件地添加管道
- java - Java:关于定位最小位置的矩阵的一些错误
- amazon-dynamodb - 出现错误无法实例化类 com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBGeneratedUuid$Generator",
- php - jquery International Telephone Input,获取国家代码+邮局电话号码
- visual-studio-code - VS Code Dev Containers 是否可以使用基于 Windows 的容器?
- algorithm - Roblox PathFindingService 错误如何解决?