Как заставить Ruby Dir # glob возвращать базовые имена, а не абсолютные пути?

#ruby #absolute-path #dir

#ruby #абсолютный путь #каталог

Вопрос:

FakeProfilePictures::Photo.all_large_names_2x (определено ниже) возвращает массив имен абсолютных путей, но когда я делаю это Dir["picture_*@2x.*"] из правильного каталога в irb , я получаю только базовые имена (то, что я хочу). Какой наилучший способ получить базовые имена? Я знаю, что мог бы сделать это, добавив, .map { |f| File.basename(f) } как показано в комментарии, но есть ли более простой / лучший / быстрый / сильный способ?

 module FakeProfilePictures
  class Photo
    DIR = File.expand_path(File.join(File.dirname(__FILE__), "photos"))

    # ...

    def self.all_large_names_2x
      @@all_large_names_2x ||= Dir[File.join(DIR, "picture_*@2x.*")] # .map { |f| File.basename(f) }
    end
  end
end
  

Ответ №1:

Вы можете сделать

 Dir.chdir(DIR) do
  Dir["picture_*@2x.*"]
end
  

после блокировки восстанавливается исходный каталог.

Комментарии:

1. Неплохо. @@all_large_names_2x ||= Dir.chdir(DIR) { Dir["picture_*@2x.*"] } сработало! Спасибо! Думаю, я соглашусь с этим, потому что это меньше кода и, вероятно, быстрее? Кто знает…

Ответ №2:

Вы могли бы chdir перейти в DIR перед глобализацией, но я бы просто прогнал все через basename .

Комментарии:

1. Почему? Как насчет решения @J-_-L, приведенного выше? Думаю, я предпочитаю это.