2011-11-14 35 views
16

Tôi có một tập tin mã Ruby (somelogic.rb) có chứa một số phương pháp và các lớp, nằm trong nói,/home/user/code. Bây giờ tôi đang viết một lớp khác trong cùng một thư mục và muốn tham chiếu đến các phương thức và các lớp trong somelogic.rb. Làm thế nào để làm điều đó? Tôi đánh giá rất cao bất kỳ đầu vào nào.Làm cách nào để tham chiếu một phương thức trong một tệp mã Ruby khác?

+1

yêu cầu 'somelogic' –

Trả lời

20

Nếu bạn đang sử dụng của Ruby 1.9 hoặc mới hơn, đây là cách đơn giản nhất để làm điều đó:

require_relative 'somelogic' 

Nếu bạn muốn mã của bạn để làm việc trong 1,9 trở lên các phiên bản của Ruby, bạn nên làm điều này thay vì:

require File.join File.dirname(__FILE__), 'somelogic' 

Cho dù bạn chọn dòng nào, bạn nên đặt nó ở đầu tệp ruby ​​của bạn. Sau đó, bất kỳ lớp, mô-đun hoặc biến toàn cục nào được xác định trong somelogic.rb sẽ có sẵn cho chương trình của bạn.

0

Trong tập thứ hai (nói otherlogic.rb) viết require '/home/user/code/somelogic.rb' trên dòng đầu tiên.

+3

Vui lòng không làm điều đó. Mã của bạn sẽ không thể di động được. – mliebelt

+0

Tôi biết tôi đã chắc chắn rằng tệp sẽ được đưa vào (1.9.2 có một số vấn đề với 'yêu cầu'). Nếu bạn đang ở trong cùng một thư mục, bạn chỉ cần yêu cầu 'otherlogic.rb' –

9

Dưới đây là kịch bản:

/home/user/code/somelogic.rb 
class MyMath 
    def self.sin(number) 
    ... 
    end 
end 

Bạn muốn sử dụng các phương pháp sin trong tập tin khác của bạn mylogic.rb.

Tùy thuộc vào phiên bản của ruby, thực hiện một điều sau đây:

mẫu
Ruby 1.8.x 
require "somelogic" 
class OtherThings 
    def some_method 
    MyMath.sin(42) 
    end 
end 

Việc sử dụng là dành cho tất cả các phiên bản ruby ​​giống nhau, nhưng các tuyên bố đòi hỏi có thể khác nhau.

Ruby 1.9.x 
require_relative "somelogic" 

hoặc biến

Ruby 1.9.x 
require "./somelogic" 

Các biến thể đầu tiên làm việc tất cả các thời gian, thứ hai chỉ nếu bạn gọi ruby mylogic.rb trong thư mục nơi mylogic.rbsomelogic.rb được đặt.

Nếu bạn muốn tải tập tin từ thư mục đó từ một điểm khởi đầu nằm trong thư mục khác, bạn nên sử dụng:

Ruby 1.8.x and Ruby 1.9.x 
$: << File.dirname(__FILE__) 

này mở rộng con đường tải của Ruby. Nó đọc đường dẫn (tương đối) của __FILE__, nhận thư mục của nó và thêm đường dẫn (tuyệt đối) của thư mục đó vào đường dẫn tải của bạn. Vì vậy, khi thực hiện việc tra cứu bằng require, các tệp sẽ được tìm thấy.

+5

Có một sự khác biệt quan trọng giữa 'require './Somelogic'' và' require_relative' somelogic''. Sau này tìm kiếm một tệp * liên quan đến chính kịch bản lệnh *, trong khi tệp trước đó trông trong thư mục làm việc hiện tại. Hãy tưởng tượng chúng ta đang ở trong một thư mục có tên là "project" và chúng ta chạy chương trình Ruby "scripts/do_the_thing.rb". Nếu "do_the_thing.rb" sử dụng 'require_relative', nó sẽ tìm" project/scripts/somelogic.rb ". Mặt khác, nếu chúng ta viết 'require'./Somelogic'', nó sẽ tìm "project/somelogic.rb". – Chuck

+0

Điểm tốt, tôi sẽ thêm điều đó vào câu trả lời. Cảm ơn rất nhiều! – mliebelt

+0

Thêm vào những gì Chuck nói, thật tệ khi làm 'require './Somelogic'' bởi vì điều đó làm cho một assmuption về thư mục làm việc hiện tại của trình thông dịch ruby, do đó rất khó để sử dụng lại mã của bạn trong các dự án khác. –

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