SORU
17 Aralık 2010, Cuma


Dosya.("..//.." Gemfile;, ____ DOSYA) expand_path Nasıl oluyor bu iş? Dosya nerde?

ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)

Sadece bir giriş yapmayı deniyorum .bazı dizin rb dosyası ve öğretici bana bu kodu kullanmak için söyler. ama gem dosya bulma nasıl olduğunu anlamıyorum.

CEVAP
18 Aralık 2010, CUMARTESİ


File.expand_path('../../Gemfile', __FILE__)

yolu mevcut dosyaya göre bildiğin bir dosyanın tam yolunu almak için biraz çirkin Ruby bir deyim vardır. Bunu yazmanın başka bir yolu şudur:

File.expand_path('../Gemfile', File.dirname(__FILE__))

hem çirkin, ama ilk versiyon daha kısadır. İlk varyant onu asmak elde edene kadar sezgisel olmayan çok, ancak, aynı zamanda. Neden .. ekstra? (ama ikinci türevi gereken neden bir ipucu olabilir.

Bu nasıl işliyor: 7* *haftanın ilk günü isteğe mutlak yolu, ikinci değişken (varsayılan olarak geçerli çalışma dizinine göre). __FILE__ kodda ise dosya yoludur. Bu durumda ikinci argüman bir dosya için bir yoldur, ve File.expand_path bir dizin olacağı için, bu yolda .. ekstra yol almak için hareket etmek zorundayız. Bu şöyle çalışır:

File.expand_path temelde bu (aşağıdaki kodda path ../../Gemfile değeri olacak relative_to /path/to/file.rb değeri) gibi uygulanır:

def File.expand_path(path, relative_to=Dir.getwd)
  # first the two arguments are concatenated, with the second argument first
  absolute_path = File.join(relative_to, path)
  while absolute_path.include?('..')
    # remove the first occurrence of /<something>/..
    absolute_path = absolute_path.sub(%r{/[^/] /\.\.}, '')
  end
  absolute_path
end

(biraz daha fazlası var, ev dizini ~ genişletir ve ... ... muhtemelen de yukarıdaki kod ile başka sorunlar vardır

Stepping araması için yukarıdaki kod absolute_path ilk değeri al /path/to/file.rb/../../Gemfile, sonra her turda döngü ilk .. kaldırılacak, birlikte yol bileşeni önce. İlk /file.rb/.. kaldırılır, o zaman bir sonraki turda /to/.. uzaklaştırılır, /path/Gemfile.

Uzun lafın kısası, File.expand_path('../../Gemfile', __FILE__) yapmaktır yolu mevcut dosyaya göre bildiğin bir dosyanın mutlak yolunu almak için bir numara. Göreli yol .. ekstra __FILE__ dosya adı ortadan kaldırmaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • ELawshea

    ELawshea

    26 Mayıs 2008
  • ExcelTutorials

    ExcelTutoria

    2 Mayıs 2009