2012-03-13 27 views
32

Tôi là người mới đối với Ruby, vì vậy xin lỗi nếu điều này nghe có vẻ ngớ ngẩn.Có phương pháp "chính" nào trong Ruby giống như trong C?

Tôi không thể tìm ra cách viết mã "chính" và có phương thức trong cùng một tệp (tương tự như C). Tôi kết thúc với một tập tin "chính" mà tải một tập tin riêng biệt có tất cả các phương pháp. Tôi đánh giá cao bất kỳ hướng dẫn nào về điều này.

tôi phát hiện bài viết sau SO nhưng tôi không hiểu nó: Should I define a main method in my ruby scripts?

Trong khi nó không phải là một vấn đề lớn, nó chỉ là dễ dàng hơn việc có thể để xem tất cả các mã có liên quan trong cùng một tập tin. Cảm ơn bạn.

[-EDIT-]

Nhờ mọi người trả lời - hóa ra bạn chỉ cần xác định tất cả các phương pháp trên mã. Ví dụ bên dưới:

def callTest1 
    puts "in test 1" 
end 

def callTest2 
    puts "in test 2" 
end 

callTest1 
callTest2 

Tôi nghĩ điều này có ý nghĩa khi Ruby cần biết tất cả các phương pháp trước. Điều này không giống như C, trong đó có một tệp tiêu đề liệt kê rõ ràng các hàm sẵn có và do đó, có thể xác định chúng bên dưới hàm main()

Một lần nữa, nhờ tất cả những người trả lời.

+0

Câu trả lời của bạn trông đẹp hơn những người khác với tôi, tại sao bạn không đăng câu trả lời và chấp nhận câu trả lời (tốt hơn là chỉnh sửa) – barlop

Trả lời

33

@ Câu trả lời của Hauleth là chính xác: không có phương pháp hoặc cấu trúc nào trong Ruby. main. Tôi chỉ muốn cung cấp một cái nhìn hơi khác nhau ở đây cùng với một số lời giải thích.

Khi bạn thực hiện ruby somefile.rb, Ruby thực hiện tất cả mã trong somefile.rb.Vì vậy, nếu bạn có một dự án rất nhỏ và muốn nó được khép kín trong một tập tin duy nhất, đó là hoàn toàn không có gì sai với việc một cái gì đó như thế này:

# somefile.rb 

class MyClass 
    def say_hello 
    puts "Hello World" 
    end 
end 

def another_hello 
    puts "Hello World (from a method)" 
end 

c = MyClass.new 
c.say_hello 
another_hello 

Nó không phải là hai khối đầu tiên không được thực hiện, nó chỉ là bạn không thấy các hiệu ứng cho đến khi bạn thực sự sử dụng lớp/phương thức tương ứng.

bit if __FILE__ == $0 chỉ là cách chặn mã mà bạn chỉ muốn chạy nếu tệp này đang được chạy trực tiếp từ dòng lệnh. __FILE__ là tên của tệp hiện tại, $0 là lệnh được thực thi bởi trình bao (mặc dù đủ thông minh để thả ruby), vì vậy so sánh hai cho bạn biết chính xác rằng: đây có phải là tệp được thực thi từ lệnh không hàng? Điều này đôi khi được thực hiện bởi các lập trình viên muốn xác định một lớp/mô-đun trong một tệp và cũng cung cấp một tiện ích dòng lệnh sử dụng nó. IMHO đó không phải là cấu trúc dự án rất tốt, nhưng cũng giống như bất cứ điều gì có trường hợp sử dụng mà làm cho nó làm cho cảm giác hoàn hảo.

Nếu bạn muốn để có thể thực thi mã của bạn trực tiếp, bạn có thể thêm một dòng shebang

#!/usr/bin/env ruby 

# rest of somefile.rb 

và làm cho nó thực thi với chmod +x somefile.rb (tùy chọn đổi tên nó mà không có phần mở rộng rb). Điều này không thực sự thay đổi tình hình của bạn. if __FILE__ == $0 vẫn hoạt động và có lẽ vẫn không cần thiết.

Sửa

Như @steenslag một cách chính xác chỉ ra, phạm vi cấp cao nhất trong Ruby là một Object gọi main. Tuy nhiên, hành vi này có hành vi hơi sôi nổi:

irb 
>> self 
=> main 
>> self.class 
=> Object 
>> main 
NameError: undefined local variable or method `main' for main:Object 
from (irb):8 

Đừng lo lắng về điều này cho đến khi bạn bắt đầu đào sâu hơn về ngôn ngữ. Nếu bạn làm muốn tìm hiểu thêm về loại nội dung này, Metaprogramming Ruby là một nội dung tuyệt vời :)

19

Không có cấu trúc như vậy. Tất nhiên bạn có thể xác định chức năng chính nhưng nó sẽ không được gọi cho đến khi bạn làm như vậy. Ruby thực hiện từng dòng vì vậy nếu bạn muốn in 'Hello World' bạn chỉ cần viết:

puts 'Hello World' 

Các câu hỏi mà bạn đề cập là về việc sử dụng một tập tin như mô-đun và thực thi, vì vậy nếu bạn viết

if __FILE__ == $0 
    # your code 
end 

Nó sẽ chỉ được gọi nếu bạn chạy tệp này. Nếu bạn chỉ yêu cầu nó trong tập tin khác thì mã này sẽ không bao giờ chạy. Nhưng IMHO đó là ý tưởng tồi, lựa chọn tốt hơn là sử dụng RubyGems và có thêm thực thi.

0

Nếu bạn muốn chạy script Ruby như file C biên soạn, làm như sau:

#!/usr/bin/env ruby 
puts "Hello" 

và sau đó chmod a+x file_name.rb. Tất cả mọi thứ bên dưới dòng đầu tiên sẽ được chạy, như thể nó là nội dung của main trong C. Tất nhiên các định nghĩa lớp và chức năng sẽ không cung cấp cho bạn bất kỳ kết quả nào cho đến khi chúng được khởi tạo/gọi (mặc dù mã bên trong định nghĩa lớp thực sự được đánh giá , vì vậy bạn có thể nhận được một số đầu ra nhưng điều này là không mong đợi trong hoàn cảnh bình thường).

5

Thực ra có một main, nhưng đó không phải là phương pháp; đó là đối tượng cấp cao nhất là bối cảnh thực hiện ban đầu của một chương trình Ruby.

class Foo 
    p self 
end 
#=> Foo 

p self 
#=> main 

def foo 
    p self 
end 
foo 
#=> main 
Các vấn đề liên quan