0

下面的代码给了我 NameError: undefined local variable or method `dir' extract_snapshots方法

该代码旨在从视频中提取快照,将它们存储在创建的临时目录中,将快照发送到服务并在之后删除目录。

  def perform
    using_temporary_directory do |dir|
      extract_snapshots
      send_snapshots
    end
  end

  def using_temporary_directory(&b)
    Dir.mktmpdir { |dir| b.call(dir) }
  end

  def extract_snapshots
    system "ffmpeg -i #{video_file_path} -vf fps=1/#{INTERVAL} #{dir}/%04d.jpg"
  end

我认为,该dir变量应该在extract_snapshotssend_snapshots中可见,因为它处于同一级别。但这不在这些方法的范围内。是否可以在不执行以下操作的情况下使dir变量可见:

  def perform
    using_temporary_directory do |dir|
      extract_snapshots(dir)
      send_snapshots(dir)
    end
  end

?

4

1 回答 1

0

你可以做这样的事情,使用attr_accessor

  attr_accessor :dir

  def perform
    using_temporary_directory do
      extract_snapshots
      send_snapshots
    end
  end

  def using_temporary_directory(&b)
    Dir.mktmpdir do |dir| 
      self.dir = dir
      b.call
    end
  ensure # clear the variable when you're finished
    self.dir = nil
  end

  def extract_snapshots
    system "ffmpeg -i #{video_file_path} -vf fps=1/#{INTERVAL} #{dir}/%04d.jpg"
  end

为了解释,attr_accessor为您创建读取器和写入器方法,相当于以下内容:

def dir
  @dir
end

def dir=(val)
  @dir=(val)
end

请注意,我认为按照您在问题结束时指定的方式进行操作并没有错,因此请根据您的情况进行选择:)

希望这会有所帮助 - 如果您有任何问题,请告诉我您的进展情况。

于 2019-09-03T15:49:29.883 回答