Tôi không hiểu ý nghĩa của $:<< "."
trong Ruby.
Tôi đã nâng cấp Ruby lên 1.9.1, nhưng chương trình không hoạt động. Bạn cùng lớp của tôi nói với tôi rằng tôi phải thêm $:<< "."
$:<< "."
làm gì?
Tôi không hiểu ý nghĩa của $:<< "."
trong Ruby.
Tôi đã nâng cấp Ruby lên 1.9.1, nhưng chương trình không hoạt động. Bạn cùng lớp của tôi nói với tôi rằng tôi phải thêm $:<< "."
$:<< "."
làm gì?
$:
là biến chứa một loạt các con đường tạo nên con đường tải Ruby bạn<<
gắn thêm một mục vào cuối mảng.
đề cập đến thư mục hiện hành
1 2 3
| | |
V V V
$: << "."
Vì vậy, bạn đang thêm thư mục hiện tại vào đường dẫn tải của Ruby
Tài liệu tham khảo:
Có thể được tìm thấy trong phần Execution Environment Variables
của các trang này từ The Pragmatic Programmers Guide
Một mảng các chuỗi, trong đó mỗi chuỗi chỉ định một thư mục được tìm kiếm cho Ruby các tập lệnh và phần mở rộng nhị phân được sử dụng bởi các phương thức tải và yêu cầu. Giá trị ban đầu là giá trị của các đối số được truyền qua tùy chọn -I dòng lệnh, theo sau là vị trí thư viện chuẩn được cài đặt, tiếp theo là thư mục hiện tại (“.”) [Rõ ràng liên kết này là dành cho phiên bản cũ hơn của Ruby vì điều này vẫn còn ở đó]. Biến này có thể được thiết lập từ bên trong một chương trình để thay đổi đường dẫn tìm kiếm mặc định; thông thường, các chương trình sử dụng $: < < dir để nối thêm thư mục vào đường dẫn.
Có thể tìm thấy trong số docs for array tại ruby-doc.org.
Gắn thêm — Đẩy đối tượng đã cho vào cuối mảng này. Biểu thức này trả về chính mảng đó, vì vậy một số nối thêm có thể được xích lại với nhau.
Kể từ phiên bản 1.9, Ruby không tìm kiếm các tệp được yêu cầu trong thư mục làm việc hiện tại AKA .
. Biến số toàn cầu $LOAD_PATH
hoặc $:
là một loạt đường dẫn mà Ruby tìm kiếm các tệp bạn require
.
Bằng cách thêm $:<< "."
vào tệp của bạn, bạn đang thực sự yêu cầu Ruby bao gồm thư mục hiện tại của bạn trong đường dẫn tìm kiếm. Điều đó ghi đè hành vi Ruby mới.
Trong ví dụ của bạn bạn thêm thư mục ("."
) để ruby đường tải ($:
) ngày làm việc.
Thư mục hoạt động ("."
) đã bị xóa khỏi đường dẫn tải (biến toàn cục $:
hoặc $-I
hoặc $LOAD_PATH
) trong Ruby 1.9 vì nó được coi là rủi ro bảo mật:
== Project1/main1.rb:
$: "" < < require 'init'
== Project1/init.rb:
puts 'init 1'
Và bạn có dự án như nhau:
== project2/main2.rb:
$: < < "." require 'init'
== project2/init.rb:
puts 'init 2'
Nếu bạn chạy Project1 từ thư mục project2, sau đó sẽ yêu cầu main1.rb project2/init.rb, không Project1 /init.rb:
~/Dự án/project2 $ ruby ../Project1/main1.rb
init 2 # có thể bất ngờ một nguy hiểm
~/Dự án/project2 $ ruby main2.rb
init 2
Bạn có thể thay đổi thư mục làm việc trong mã của mình, ví dụ: sử dụng Dir.chdir
:
ruby-1.9.2-p290 :002 > puts File.expand_path('.')
=> /home/alex/Projects
ruby-1.9.2-p290 :003 > Dir.chdir('..')
ruby-1.9.2-p290 :004 > puts File.expand_path('.')
=> /home/alex
tôi khuyên bạn nên sử dụng các kỹ thuật sau đây thay vì $: << '.'
:
require_relative (của Ruby 1.9 chỉ)
Thêm thư mục của tập tin vào thư mục làm việc (cách tiếp cận chung vì nó tương thích với Ruby 1.8): $: << File.expand_path('..', __FILE__) etc.
. __FILE__
là tham chiếu đến tên tệp hiện tại. File.expand_path chuyển đổi tên đường dẫn thành tên đường dẫn tuyệt đối.
Điều quan trọng là phải hiểu TẠI SAO Ruby không còn bao gồm "' .' "trong đường dẫn tìm kiếm. Một khai thác trên một ứng dụng có thể xảy ra bởi một người nào đó có thể thả một tập tin với tên của một tập tin cần thiết vào thư mục "' .' "của bạn. Hành vi trước 1.9 sẽ tải tệp đó, ghi đè hành vi của tệp được yêu cầu và sẽ chạy với quyền của chủ sở hữu ứng dụng. Đó có thể là thảm họa. Hành vi mặc định 'require' đã được thay đổi, nhưng' require_relative' được thêm vào để cho phép bạn tải từ các thư mục liên quan đến tập lệnh của bạn. Tôi không bao giờ sử dụng '$: << '.'' nhưng thay vào đó liệt kê một cách rõ ràng đường dẫn. –
Lưu ý rằng, nếu mục tiêu của dòng đó là cho phép bản thân các tệp 'require' trong cùng thư mục với tập lệnh hiện tại, không phải * khá * những gì bạn muốn: nó sẽ không hoạt động chính xác trừ khi tập lệnh đang hoạt động danh mục. Để thêm thư mục của kịch bản vào đường dẫn tải, sử dụng '$ :. unshift File.dirname (__ FILE __)' (tôi sử dụng 'unshift' để * prepend * thư mục vào danh sách, để nó được ưu tiên hơn bất kỳ đường dẫn tải nào khác có lẽ.) – Matchu