首页 > 解决方案 > 我可以以惯用/简洁的方式使这种“块包装”成为可选吗?

问题描述

在 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(”加上十几行的复杂方法,代码重复太多,因此寻找一种更简洁的方法来完成它。

标签: ruby

解决方案


您可以尝试使用以下方法:

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关键字的关系。


推荐阅读