2

让我先声明我是一名“新”程序员——一名 IT 人员在完成各种教程后尝试解决他的第一个“真正”问题。

所以 - 这就是我想要做的。我正在查看 .csv 文件的目录 - 它将采用以下格式:999999_888_filename.csv

我想将“_”文件名的每个部分作为变量返回,以传递给另一个程序/脚本以执行其他任务。我想出了以下代码:

require 'rubygems'
require 'fssm'

class Watcher

def start
  monitor = FSSM::Monitor.new(:directories => true)
  monitor.path('/data/testing/uploads') do |path|
    path.update do |base, relative, ftype| 
      output(relative)
    end
    path.create do |base, relative, ftype| 
      output(relative)
    end
    path.delete { |base, relative, ftype| puts "DELETED #{relative} (#{ftype})" }   
  end
  monitor.run
end


def output(relative)
  puts "#{relative} added"
  values    = relative.split('_',)
  sitenum  = values[0]
  numrecs  = values[1]
  filename = values[2]
  puts sitenum
 end
end

我的第一个“puts”给了我完整的文件名(它只是在那里显示脚本正在运行),第二个 puts 返回了“sitenum”。我希望能够访问此输出方法的“外部”。我在 libs/ 文件夹中有这个文件(名为 watcher.rb),我在项目根目录中有第二个文件,名为“monitor.rb”,它只包含:

require './lib/watcher'

watcher = Watcher.new
watcher.start

而且我不知道如何从这个文件中访问我的“sitenum”、“numrecs”和“filename”。我不确定它是否需要是变量、实例变量或什么。我玩过 attr_accessible 和其他东西,但没有任何效果。我决定在这里问,因为我一直在旋转我的轮子来做几件事,而且我开始通过自己的搜索来迷惑自己。

提前感谢您提供的任何帮助或建议。

4

2 回答 2

2

Watcher类的顶部,您将要定义三个attr_accessor声明,它们给出了您想要的行为。(attr_reader如果你只是在阅读,attr_writer如果你只是在写作,attr_accessor如果两者兼而有之。)

class Watcher
    attr_accessor :sitenum, :numrecs, :filename

    ... 
    # later on, use @ for class variables
    ...
        @sitenum = 5
    ...
end

现在你应该对 etc 没有任何问题watcher.sitenum。这是一个例子

编辑:一些错别字。

于 2012-05-22T02:57:44.657 回答
2

除了 Jordan Scales 的回答,这些变量应该初始化

class Watcher
  attr_accessor :sitenum, :numrecs, :filename

  def initialize
    @sitenum = 'default value'
    @numrecs = 'default value'
    @filename = 'default value'
  end

  ...
end

否则你会得到无意义的价值nil

于 2012-05-22T03:46:03.440 回答