2012-02-13 2 views
2

Что случилось с моим кодом? FileNameArray повторно используется?Что вызывает предупреждение «уже инициализированное постоянное»?

f.rb: 17: предупреждение: уже инициализирована константа FileNameArray

number = 0 
while number < 99 
    number = number + 1 
    if number <= 9 
    numbers = "000" + number.to_s 
    elsif 
    numbers = "00" + number.to_s 
    end 
    files = Dir.glob("/home/product/" + numbers + "/*/*.txt") 
    files.each do |file_name| 
    File.open(file_name,"r:utf-8").each do | txt | 
     if txt =~ /http:\/\// 
     if txt =~ /static.abc.com/ or txt =~ /static0[1-9].abc.com/ 
     elsif 
     $find = txt 
     FileNameArray = file_name.split('/') 
     f = File.open("error.txt", 'a+') 
     f.puts FileNameArray[8], txt , "\n" 
     f.close 
     end 
     end 
    end 
    end 
end 
+1

FileNameArray является постоянным (потому что это капитализируется), и вы определяете его в петле. –

+0

@AlexD Я только начинаю в Ruby сам и этот крошечный немного информации о том, что Capization - это то, что создает Constant, очень полезно спасибо! –

ответ

2

В вопросах имени переменных дел Руби. Локальные переменные должны начинаться с lower case character. Константы - с верхним регистром.

Итак, попробуйте переименовать FileNameArray в fileNameArray.

Кроме того, glob содержит расширенные выражения, которые могут сэкономить вам один цикл и десяток LOC. В вашем случае это выражение должно выглядеть примерно так:

Dir.glob("/home/product/00[0-9][0-9]/*/*.txt")

+0

спасибо, он работает! :) – Acc

+0

использование Dir.glob ("/ home/product/00 [0-9] [0-9]/*/*. Txt") очень медленно, что цикл сначала, потому что Dig.glob будет полностью сканировать прямо, чем передать имя файла другому процессу? – Acc

+0

вы это измерили? также, если в нем нет 99 папок, но всего 20 циклов for будут по-прежнему вызывать glob 99 раз - это неправильно –

5

Вы можете быть новичком рубиновый, я попытался переписать тот же код в рубиновой пути ...

(1..99).each do |number| 
    Dir.glob("/home/product/" + ("%04d" % numbers) + "/*/*.txt").each do |file_name| 
    File.open(file_name,"r:utf-8").each do | txt | 
     next unless txt =~ /http:\/\// 
     next if txt =~ /static.abc.com/ || txt =~ /static0[1-9].abc.com/   

     $find = txt 
     file_name_array = file_name.split('/') 
     f = File.open("error.txt", 'a+') 
     f.puts file_name_array[8], txt , "\n" 
     f.close  
    end 
    end 
end 

Очки отметить вниз ,

  1. В рубин, если вы используете переменную с префиксом $ символа, он воспринимается как global variable. Поэтому используйте $find, только если это необходимо.
  2. В рубине constant variable начинается с capital letter, обычно мы NOT Предполагается изменить постоянное значение. Возможно, это вызвало ошибку в вашей программе.
  3. (1..99) буквальный используется для создания экземпляра из Range класса, который возвращает значение от 1 до 99

 Смежные вопросы

  • Нет связанных вопросов^_^