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」は完全なファイル名を提供し(スクリプトが機能していることを示すためだけにあります)、2番目のputsは「sitenum」を返します。この出力メソッドの「外部」にアクセスできるようにしたいと思います。このファイル(watcher.rbという名前)はlibs /フォルダーにあり、プロジェクトルートには「monitor.rb」という2番目のファイルがあります。このファイルには次のものが含まれています。

require './lib/watcher'

watcher = Watcher.new
watcher.start

そして、このファイルから「sitenum」、「numrecs」、「filename」にアクセスする方法がわかりません。変数である必要があるのか​​、インスタンス変数である必要があるのか​​、それとも何である必要があるのか​​わかりません。attr_accessibleなどで遊んだことがありますが、何も機能しません。私はいくつかのことのために自分の車輪を回しているので、ここで尋ねることに決めました、そして私は自分自身で検索することによって自分自身を混乱させ始めています。

あなたが持っているかもしれないどんな助けやアドバイスにも前もって感謝します。

4

2 に答える 2

2

クラスの最上位で、必要な動作を与えるWatcher3つの宣言を定義する必要があります。attr_accessorattr_reader読んでいるだけattr_writerの場合、書いているだけのattr_accessor場合、両方の場合。)

class Watcher
    attr_accessor :sitenum, :numrecs, :filename

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

watcher.sitenumこれで、 etcに問題はないはずです。例を次に示します。

編集:いくつかのタイプミス。

于 2012-05-22T02:57:44.657 に答える
2

ジョーダンスケールの答えに加えて、これらの変数は初期化する必要があります

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 に答える