2014-06-09 2 views
3

Я хочу, чтобы получить все файлы в каталоге, кроме скрытых файлов (файлов, чьи имена начинаются с точки):Почему ruby ​​Pathname # basename возвращает имя файла с префиксом "Pathname:"?

@files = Pathname.new('.').children.select do |file| 
    file.basename[0] != '.' 
end 

И я не могу этого сделать, соз #basename возвращает строку в виде "<#Pathname:.envrc>". Поэтому мне нужно сделать это file.basename =~ '#<Pathname:.', что для меня кажется странным.

Почему они префиксное слово «Pathname»?

+1

Просто используйте метод 'to_s' - http://ruby-doc.org/stdlib-2.1.0/libdoc/pathname/rdoc/Pathname.html#method-i-to_s –

+1

@ArupRakshit благодарит много! – yukas

ответ

2

Как предложил Arup, чтобы получить список всех файлов, кроме скрытых файлов, я должен сделать это:

@files = Pathname.new('.').children.select do |file| 
    file.to_s[0] != '.' 
end 
+0

Но почему вы хотите протестировать '.' .. В соответствии с [doc] (http://ruby-doc.org/stdlib-2.1.0/libdoc/pathname/rdoc/Pathname.html#method-i- дети) - * это nevers дать '.' и' ..' .. Почему тогда вы хотите проверить? * –

+0

Я тестирую скрытые файлы, а не для текущего каталога – yukas

+0

Хорошо .. Получил это .. .. –

3

Глядя на ответ на ФП, я думаю, она может быть записана в виде

@files = Pathname.new('.').children(false).reject do |file| 
    file.to_s.start_with? '.' 
end 

Doc из children говорит - Если вы установили with_directory в false, то возвращаемые имена путей будут содержать только имя файла. Это означает, что мы сделаем все basenames как: Путь объект понравился Pathname:.git, Pathname:English.rb. Теперь применив #to_s, у нас будет '.git', 'English.rb'. Таким образом, теперь мы можем использовать метод String#start_with? для проверки, если начинается с . или нет.

+1

Я думаю, это вопрос личного вкуса to_s [0] == '.' или to_s.start_with? ''. Кроме того, спасибо за детей (ложный) отзыв. – yukas

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