2012-04-25 67 views
40

Tôi có thể gọi trực tiếp chức năng ruby ​​từ dòng lệnh bằng cách nào?Gọi hàm ruby ​​từ dòng lệnh

Hãy tưởng tượng, tôi sẽ có kịch bản này test.rb:

class TestClass 
    def self.test_function(some_var) 
     puts "I got the following variable: #{some_var}" 
    end 
end 

Nếu kịch bản này được chạy từ dòng lệnh (ruby test.rb), không có gì xảy ra (như dự định).

Có điều gì đó như ruby test.rb TestClass.test_function('someTextString') không? Tôi muốn có được kết quả sau: I got the following variable: someTextString.

Trả lời

74

Đầu tiên tên của lớp cần bắt đầu bằng chữ hoa và vì bạn thực sự muốn sử dụng phương pháp tĩnh, định nghĩa tên hàm cần bắt đầu bằng self..

class TestClass 
    def self.test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

Sau đó, để gọi mà từ dòng lệnh bạn có thể làm:

ruby -r "./test.rb" -e "TestClass.test_function 'hi'" 

Nếu bạn thay vì có test_function như một phương pháp dụ, bạn muốn có:

class TestClass 
    def test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

sau đó bạn 'd gọi nó bằng:

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'" 
+9

+1 :). Cũng thế. CamelCase cho các phương thức và tên biến không phải là kiểu Ruby. Sử dụng dấu gạch dưới: 'test_function',' some_var' – fl00r

+0

@ fl00r Điểm tốt! Tôi đã cập nhật câu trả lời. – Candide

+0

Xem [reply by @lunero] (http://stackoverflow.com/a/37948278/1245614) cho nhiều tham số – skitheo

2

Nếu bạn đang làm việc trên giao diện dòng lệnh, thì tôi khuyên bạn nên xem thor.

Thor trực tiếp ánh xạ các lệnh của bạn tới các phương thức trong lớp được xác định, xem ví dụ thor wiki.

11

Đây là một biến thể khác, nếu bạn thấy cú pháp gõ ruby ​​tại dòng lệnh là khó xử và bạn thực sự chỉ muốn chuyển args sang ruby. Dưới đây là test.rb:

#!/usr/bin/env ruby 

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
end 

TestClass.test_function(ARGV[0]) 

Hãy test.rb thực thi và chạy nó như thế này:

./test.rb "Some Value" 

Hoặc chạy nó như thế này:

ruby test.rb "Some Value" 

này hoạt động vì ruby ​​tự động cài đặt ARGV mảng đối số được truyền cho tập lệnh. Bạn có thể sử dụng ARGV[0] hoặc ARGV.first để nhận đối số đầu tiên hoặc bạn có thể kết hợp các arg vào một chuỗi đơn, cách nhau bằng dấu cách, sử dụng ARGV.join(' ').

Nếu bạn đang thực hiện rất nhiều công cụ dòng lệnh, cuối cùng bạn có thể sử dụng cho Shellwords, nằm trong lib chuẩn ruby.

+1

Thông thường bạn sẽ quấn mã cấp cao nhất vào 'if __FILE__ == $ 0'. –

3
#!/usr/bin/env ruby 

class A 
    def run 
    p :Hello_world 
    end 
    self 
end.new.run 

Cách thông thường để kịch bản Ruby là chỉ cần sử dụng cấp cao nhất môi trường thực thi gọi chính. Bạn chỉ có thể bắt đầu xác định các phương thức và mã bạn viết bên ngoài một lớp, và chúng sẽ được thực thi trực tiếp. (BTW, mã bên trong một lớp, nhưng bên ngoài bất kỳ phương pháp nào cũng sẽ chạy "tự nó".Tôi cũng thích viết tất cả các mã trong một lớp có tên và khởi tạo lớp đó, vì vậy bạn có thể kết hợp các kỹ thuật .. có lớp trả về đối tượng riêng của nó .. và sau đó chỉ sử dụng một chút của mã cấp cao nhất đó để cấp phát, khởi tạo và sau đó chấm vào lớp.

Với điều này, bạn chỉ có thể nhập $ ruby test.rb và nó sẽ làm những gì bạn muốn. Hoặc bạn có thể chmod +x test.rb; ./test.rb vì chúng tôi đã làm add a shebang.

0

Chỉ cần tiện ích mở rộng cho câu trả lời của Ingenu đối với trường hợp chức năng không in ra điều gì đó, nhưng trả lại gì đó.

Chúng tôi sẽ có test.rb sau

class TestClass 
    def self.test_function(some_var) 
     return "I got the following variable: " + some_var 
    end 
end 

Sau đó, để gọi mà từ dòng lệnh và nhận giá trị trả về:

ruby -r "./test.rb" -e "puts TestClass.test_function('hi')" 
2

Nếu bạn có nhiều lý lẽ để gọi trong ví dụ như thế này:

class TestClass 
    def self.test_function(some_var1, some_var2) 
    puts "I got the following variables: #{some_var1}, #{some_var2}" 
    end 
end 

chạy nó như thi s (các đối số cần phải được dấu phẩy tách ra trong trường hợp này)

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi','Mike'" 
+0

điều này thật tuyệt vì câu trả lời ban đầu không bao gồm 2 đối số. – camdixon

0

Nếu bạn biết rằng làm thế nào để gọi một tập tin rb từ commandline

Điều này có thể làm toàn bộ trick cho bạn.

Những gì bạn đã làm là, chỉ cần xác định các phương pháp của bạn trong lớp học. Bây giờ bạn có thể gọi nó bên dưới định nghĩa. Nếu bạn vẫn muốn đọc, hãy mở to mắt của bạn

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
    test_function(var) 
end 
Các vấn đề liên quan