2010-04-26 25 views
31

Tôi đã thấy nhiều mẫu mã Ruby với dòng này (ví dụ: http://www.sinatrarb.com/). Mục đích của điều này là gì?yêu cầu 'rubygems'

# require 'rubygems' 
require 'sinatra' 
get '/hi' do 
    "Hello world!" 
end 

Trong mọi trường hợp, mã hoạt động không có dòng này.

Trả lời

14

Thường là không cần thiết. Nó sẽ cho phép bạn yêu cầu phiên bản cụ thể của đá quý cụ thể mặc dù, với lệnh gem.

http://guides.rubygems.org/patterns/#requiring_rubygems

+0

RubyGems sẽ chọn phiên bản được cài đặt mới nhất của các đá quý theo sau. Nếu không tìm thấy phần mềm như vậy, ngoại lệ sẽ được tạo ra. – lkahtz

+0

Tại sao nó không cần thiết? Đó là cách tốt nhất để tải một viên ngọc cần thiết. –

+2

Trên thực tế, "yêu cầu" rubygems "" không tải một viên ngọc cần thiết, nó chỉ thay đổi hành vi của phương pháp "yêu cầu". –

21

require 'rubygems' sẽ điều chỉnh Ruby loadpath cho phép bạn yêu cầu thành công đá quý bạn cài đặt thông qua rubygems, mà không nhận được một LoadError: no such file to load -- sinatra.

Từ các tài liệu rubygems-1.3.6:

Khi RubyGems là cần thiết, Kernel # đòi hỏi phải được thay thế bằng chính chúng ta có khả năng bốc đá quý theo yêu cầu.

Khi bạn gọi require 'x', đây là những gì sẽ xảy ra:

  • Nếu tập tin có thể được nạp từ loadpath của Ruby đang tồn tại, nó là.

  • Nếu không, đá quý được cài đặt sẽ được tìm kiếm cho một tệp có số là đối sánh. Nếu nó được tìm thấy trong gem 'y', viên đá quý đó được kích hoạt (được thêm vào đường tải).

Chức năng bình thường yêu cầu trả về false nếu tệp đó đã được tải được giữ nguyên.

Xem tài liệu cho Kernel#require để hiểu tại sao điều này là cần thiết.

+7

Btw, tôi không khuyên bạn nên sử dụng nó. Xem bài đăng này của Ryan Tomayko: http://gist.github.com/54177 –

+1

@Carmine Paolino, về nhận xét của bạn: Sinatra là một viên ngọc. Cách tốt nhất để đảm bảo rằng yêu cầu nó không tạo ra lỗi mà không sử dụng 'rubygems'' yêu cầu là gì? –

+7

Trong Ruby 1.9 'yêu cầu "rubygems"' xảy ra tự động. Trong rubygems ruby ​​trước đó không phải là tự động cần thiết và bạn sẽ nhận được lỗi. Đặt cược tốt nhất của bạn là tự động nhập nó trừ khi bạn chắc chắn bạn đang chạy luôn trong 1,9+. Ruby sẽ không quan tâm nếu bạn yêu cầu nó hai lần trong 1,9+ và mã của bạn sẽ được hạnh phúc trong 1,8.whatever. –

11

Là một bổ sung cho câu trả lời đúng (và chính xác): Ruby 1.9 và phiên bản mới hơn với RubyGems được tích hợp sẵn, vì vậy không cần thiết phải thực hiện require 'rubygems'. Source here

+1

Bạn nói đúng, miễn là ruby ​​không được xây dựng bằng '--disable-rubygems'. – xoryves