2009-08-27 39 views
35

Tôi có một kịch bản với một phương pháp nhà máy mà tôi muốn trả lại một triển khai khác nhau của một số lớp tùy thuộc vào việc tập lệnh có chạy từ JRuby hay Ruby hay không. Bất cứ ai có bất kỳ ý tưởng về cách tôi có thể nói sự khác biệt từ bên trong kịch bản của tôi?Làm cách nào để biết liệu tôi có đang chạy từ JRuby và Ruby không?

Vài suy nghĩ ban đầu của tôi thật:

  • Cố gắng để 'bao gồm Java và giải cứu trở về việc thực hiện của Ruby nếu nó không thành công. Phương pháp này không hoạt động. Ruby đủ thông minh để báo lỗi bất kể tôi bắt đầu/cứu/kết thúc.

  • Làm điều gì đó ngốc nghếch với ID tiến trình. Tôi muốn tránh điều này, vì nó luôn luôn giống như một hack.

Trả lời

46

Tôi tin rằng bạn có thể kiểm tra hằng số RUBY_PLATFORM.

+1

Đúng. Đó là "java" dưới JRuby và hệ điều hành cơ bản ở nơi khác. – Chuck

+0

Thật vậy. Đủ tôt cho tôi. Cảm ơn rất nhiều! – pastorius

+0

@Chuck: cảm ơn bạn đã xác minh. Tôi không có một cài đặt JRuby tiện dụng. – JesperE

7

Tôi không hiểu câu hỏi của bạn. Bạn dường như đang trộn hai mức trừu tượng hoàn toàn khác nhau: Ruby là một ngôn ngữ lập trình, JRuby là trình biên dịch cho ngôn ngữ lập trình Ruby. Các câu hỏi cho dù chương trình của bạn đang chạy trong Ruby hoặc trong JRuby chỉ đơn giản là không có ý nghĩa: khi nó đang chạy trong JRuby, nó chạy trong Ruby, bởi vì JRuby là một thực hiện của Ruby.

Cũng giống như yêu cầu "làm cách nào tôi có thể biết liệu tôi có đang lái xe trong Ford so với xe hơi không?"

Nếu bạn muốn biết những gì bạn đang triển khai, bạn có thể kiểm tra hằng số RUBY_ENGINE toàn cầu. Nó được cho là phổ biến và xác định duy nhất động cơ bạn đang chạy trên, mặc dù nó không may thất bại vì ba lý do:

  1. trên một số công cụ, nó không làm cho bạn biết những gì động cơ nó đang chạy trên, ví dụ trên YARV tôi mong đợi RUBY_ENGINE'yarv', nhưng thực tế là 'ruby'. Vì vậy, nó không thành công ở phần "xác định".
  2. thậm chí tệ hơn: trên MRI, nó là cũng'ruby', có nghĩa là không chỉ có khả năng không cho bạn biết những gì động cơ bạn đang chạy trên, nhưng cũng hoàn toàn động cơ khác nhau mà trả lại cùng một giá trị. IOW, nó cũng thất bại ở phần "duy nhất".
  3. và cuối cùng nhưng không kém phần quan trọng, RUBY_ENGINE là khá mới, do đó, nó chưa được hỗ trợ bởi tất cả các công cụ, có nghĩa là nó không thành công ở phần "phổ quát".

Tuy nhiên, mục đích của bạn một cái gì đó giống như

if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby' 

nên hoạt động tốt.

+0

nếu được xác định? RUBY_ENGINE và RUBY_ENGINE == 'jruby' –

+0

Để sử dụng sự tương tự của bạn, đôi khi bạn cần phải biết nếu xe của bạn là một ford. Ví dụ bạn cần biết nếu bạn muốn hỗ trợ một tiện ích mở rộng gốc không được jruby hỗ trợ trong mã của bạn. – Will

+0

Điểm tốt về RUBY_ENGINE là tương đối mới. Đã có một phiên bản cũ của JRuby mà không có nó? – Trejkaz

40

Như đã được nêu ở đây, có nhiều cách để phát hiện JRuby.Dưới đây là danh sách đầy đủ, được sắp xếp theo sở thích:

  1. Đơn giản và dễ hiểu:

    RUBY_PLATFORM == "java" 
    
  2. Điều này có thể được sử dụng cho impls khác nữa. Nhược điểm là MRI 1.8.6 và 1.8.7 không hỗ trợ RUBY_ENGINE, vì vậy chúng ta cần xác định? kiểm tra:

    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' 
    
  3. Nếu bạn muốn biết thêm một chút hơn là chỉ cho dù đó là JRuby hay không:

    if defined? JRUBY_VERSION 
    

    JRUBY_VERSION chỉ được định nghĩa trong JRuby và trong cung cấp ngắn thông tin phiên bản, như "1.5.0.dev"

  4. Cách ít yêu thích nhất: yêu cầu 'java' hoặc yêu cầu 'jruby' và giải cứu. Không nên sử dụng.

+2

Trên thực tế, bạn phải cung cấp dấu ngoặc đơn cho phiên bản thứ hai để nó có thể được xác định không? (RUBY_ENGINE) && RUBY_ENGINE == 'jruby' –

+1

Cảm ơn, @Tyler, thực sự đó là một sai lầm ngớ ngẩn, đã được sửa! – vsizikov

+0

Tùy chọn cuối cùng không tệ như âm thanh. Nếu bạn đang đi kiểm tra JRuby và sau đó yêu cầu 'java' anyway (và nếu bạn không, hãy đối mặt với nó, tại sao thậm chí bận tâm phát hiện JRuby), sau đó thêm một cứu hộ không có vẻ xấu như vậy. – Trejkaz

1

Nếu bạn đang gỡ lỗi shell, irb, RVM hoặc một số loại plugin như trình soạn thảo văn bản Ruby, tôi thích chi tiết hơn RUBY_DESCRIPTION.

Nếu bạn đang cố gắng chạy một số mã dựa trên nếu bạn đang chạy JRUBY hay không, các hằng số khác đã nhận xét là tốt: RUBY_ENGINE, JRUBY_VERSION hoặc RUBY_PLATFORM.

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