2013-09-24 44 views
6

Giả sử tập lệnh cần truy cập thư mục, giả sử /some/where/abc trên hệ điều hành "tùy ý". Có một vài tùy chọn để xây dựng các con đường trong Ruby:Làm thế nào để xây dựng một đường dẫn tuyệt đối di động trong Ruby?

  • File.join('', 'some', 'where', 'abc')
  • File.absolute_path("some#{File::SEPARATOR}where#{File::SEPARATOR}abc", File::SEPARATOR)
  • Pathname trong API chuẩn

Tôi tin rằng giải pháp đầu tiên là đủ rõ ràng, nhưng thành ngữ. Theo kinh nghiệm của tôi, một số mã số nhận xét yêu cầu một lời nhận xét để giải thích những gì nó làm ...

Các Câu hỏi

Có cách nào tốt hơn để xây dựng một đường dẫn tuyệt đối là Ruby, nơi phương tiện tốt hơn "hiện công việc và nói cho chính nó "?

+2

Tôi vừa liên kết tài liệu trong quá trình xem xét mã. Nó nói rõ ràng "Trả về một chuỗi mới được hình thành bằng cách nối các chuỗi bằng cách sử dụng Tệp :: SEPARATOR." 'File # join' là cách thông thường để tạo ra các đường dẫn di động. –

+1

Tùy thuộc vào ý bạn là "hệ điều hành tùy ý", '" tmp/abc/"' dưới dạng chuỗi ký tự là một đường dẫn hợp lệ trên Linux, Mac và Windows. –

+0

Tài liệu, hoặc chỉ đường dẫn dự định làm nhận xét, hoạt động tốt. Chỉ cố gắng tìm các phép ẩn hoặc quên trong Ruby. –

Trả lời

3

Điều tôi sẽ nhận được nếu tôi đang thực hiện đánh giá mã là trên Windows /tmp không nhất thiết phải là nơi tốt nhất để tạo thư mục tạm thời và cũng có thể không rõ ràng đối với bình thường. <nothing>/tmp/abc. Do đó, tôi muốn giới thiệu mã này:

File.join(Dir.tmpdir(), 'abc') 

Xem Ruby-doc for an explanation.

CẬP NHẬT

Nếu chúng ta mở rộng vấn đề đến một giải pháp chung chung hơn mà không liên quan đến sử dụng tmpdir(), tôi không thể nhìn thấy một cách tròn bằng cách sử dụng ban đầu '' thành ngữ (hack?). Trên Linux, đây không phải là vấn đề quá nhiều, có lẽ, nhưng trên Windows với nhiều ký tự ổ đĩa nó sẽ là. Hơn nữa, có vẻ như không phải là một API Ruby hoặc đá quý để lặp lại các điểm gắn kết.

Vì vậy, đề nghị của tôi sẽ được giao định nghĩa mount point đến một tùy chọn cấu hình mà có thể '/' cho Linux, 'z:/' cho Windows, và smb://domain;[email protected]/mountpoint cho một phần Samba, sau đó sử dụng File.join(ProjectConfig::MOUNT_POINT, 'some', 'where', 'abc').

+0

Bắt tốt trên tmpdir. Điều này thậm chí còn di động hơn và cũng phản ánh tốt hơn mục đích. +1 –

+0

Cảm ơn đề xuất này. Tuyệt vời để giải quyết vấn đề cụ thể của tôi. Tôi chưa đánh dấu câu hỏi là đã trả lời. Hãy xem liệu ai đó có một ý tưởng hay cho vấn đề chung (bây giờ nhận ra rằng '/ tmp' dẫn câu hỏi đến một cách bất ngờ). –

+1

@Eric Tôi thấy bạn đã viết lại câu hỏi! Tôi đã có một suy nghĩ và một cái nhìn xung quanh, và tôi không thể nhìn thấy một giải pháp chung cho những gì làm cho tôi khó chịu nhất, hàng đầu ''''. Dường như không có cách chung để lặp lại các điểm gắn kết, chẳng hạn như lấy 'c: /' cho Windows hoặc điểm gắn kết Samba trên Linux, v.v. Có thể ủy quyền định nghĩa điểm gắn kết với một tùy chọn cấu hình là sự thỏa hiệp tốt nhất và sử dụng ' File.join (ProjectConfig :: MOUNT_POINT, 'foo', 'bar') '? –

2

File#join là cách kinh điển để xây dựng một đường dẫn di động trong Ruby. Tôi tự hỏi ai đang xem xét lại. Có lẽ Ruby mới đối với tổ chức của bạn.

Tôi đồng ý với @ChrisHeald đề cập đến tài liệu là cách tốt nhất để giải thích mã cho người đánh giá.

+0

Cảm ơn bạn. Tôi đồng ý với tất cả các ý kiến ​​cho đến nay, vì vậy +1. File # join là cách tiếp cận ưa thích của tôi, nhưng dựa vào một thành ngữ. Câu hỏi thực sự là về "khoe khoang" một cách tốt hơn để giải quyết vấn đề này (nếu có) --- đánh giá chỉ là các thiết lập để minh họa điều gì có thể xảy ra. –

Các vấn đề liên quan