2013-06-07 31 views
5

Tôi là người mới sử dụng Scala và tôi tự hỏi tại sao phương pháp chính không chạy trong tập lệnh này?Phương pháp chính không được gọi trong kịch bản Scala

class Word { 
} 

object HelloWorld { 
    def main(args: Array[String]) { 
    println("Hello, world!") 
    } 
} 

Điều thú vị là nó hoạt động tốt khi tôi xóa lớp Word. Tại sao điều này? Và làm thế nào để sửa nó?

+0

Bạn chạy tập lệnh chính xác như thế nào? – gzm0

+0

@gzmo im bằng cách sử dụng 'scala test.scala' nhưng 'kiểm tra scalac.scala' theo sau bởi 'scala test.scala' không hoạt động hoặc là @squiguy không hoạt động hoặc là – Abs

Trả lời

9

Như đã trình bày trong getting started with scala, bạn nên gọi một cách rõ ràng phương thức main, khi chạy file scala như một kịch bản:

class Word { 
} 

object HelloWorld { 
    def main(args: Array[String]) { 
    println("Hello, world!") 
    } 
} 

HelloWorld.main(args) 

Nếu bạn muốn biên dịch và chạy, bạn sẽ phải từ bỏ tên của đối tượng giữ phương pháp main:

scalac test.scala 
scala HelloWorld 
+0

Hoàn hảo! cảm ơn rất nhiều – Abs

4

thực tế những gì bạn đã viết không phải là một kịch bản Scala, nhưng một chương trình Scala đơn giản. Scala script khác với các chương trình đơn giản theo cách chúng được tổ chức và chạy, không có giai đoạn biên dịch, trình biên dịch Scala sẽ giải thích dòng tệp nguồn theo dòng, như trong phiên REPL.

Để thực hiện một kịch bản Scala từ tập tin của bạn chỉ để lại:

println("This is a scala script") 

và lưu nó trong *.scala tập tin, sau đó chạy nó với scala lệnh trong cửa sổ Terminal, không cần bất kỳ scalac gọi trước. Trình biên dịch Scala sẽ tự động xác định rằng đây là một tập lệnh, bởi vì tệp nguồn kết thúc bằng một biểu thức. Khi bạn đặt HelloWorld.main(args) vào cuối tệp của mình, tệp sẽ được thực thi dưới dạng tệp tập lệnh, nhưng đối tượng lớp và đối tượng có phương thức main() hoàn toàn lỗi thời

7

Lý do hành vi lạ này rất đơn giản. Khi chạy các scala thực thi với một tên kịch bản được truyền trên dòng lệnh (như trong scala hello.scala), những gì xảy ra theo mặc định là nó sẽ cố gắng "đoán" những gì để chạy. Nếu tệp chỉ chứa một đối tượng duy nhất với phương thức main phù hợp (có nghĩa là nó cũng sẽ là điểm nhập chương trình thích hợp), thì phương thức main sẽ chạy. Nếu không, tệp scala được hiểu là một tập lệnh thích hợp (với các câu lệnh được chấp nhận ở cấp cao nhất và chạy từng dòng, giống như trong chế độ tương tác). Vì vậy, thực sự có 2 cách để chạy một tệp scala bằng cách sử dụng trình thông dịch scala có thể thực thi được (lần đầu tiên ít khi được sử dụng). Vì vậy, ngay sau khi bạn thêm một lớp khác vào tệp nguồn của bạn, chế độ thực thi đầu tiên (gọi phương thức chính) không kích hoạt nữa và bạn rơi trở lại dòng tiêu chuẩn bằng cách diễn giải dòng. Vì vậy, phương pháp chính của bạn không được gọi nữa trừ khi bạn gọi nó một cách rõ ràng.

Để tham khảo, đây là sản phẩm của scala -help (tôi nhấn mạnh):

Cách sử dụng: scala < tùy chọn > [< script | lớp | đối tượng | jar > < luận >] hoặc scala -help

Tất cả các tùy chọn cho scalac (xem scalac -help) cũng được cho phép. Đối số đầu tiên được đưa ra ngoài các tùy chọn cho scala chỉ định những gì cần chạy.mục tiêu Runnable là:

  • một tập tin nguồn chứa scala
  • tên của một lớp học biên soạn
  • một file jar Runnable với một giá trị Main-Class thuộc tính
  • hoặc nếu không có lập luận được đưa ra, các repl (vỏ tương tác) được bắt đầu

Tùy chọn để scala mà đạt được thời gian chạy java:

-Dname = prop pa ssed trực tiếp đến java để thiết lập thuộc tính hệ thống
-J -J được lột quần áo và truyền cho java như nó vốn có
-nobootcp không đặt các lọ scala trên classpath khởi động (chậm hơn)

tùy chọn khởi động khác:

-howtorun gì để chạy (mặc định: đoán)
tải trước -i trước khi bắt đầu repl
-e thực hiện như thể nhập vào repl
Save lưu kịch bản được biên soạn trong một cái lọ để sử dụng trong tương lai
-Không c ompilation daemon: không sử dụng trình biên dịch FSC ẩn

Một lập luận tập tin sẽ được chạy như một kịch bản scala trừ khi nó chỉ chứa đơn vị biên dịch khép kín (lớp và các đối tượng) và chính xác một phương pháp chính Runnable. Trong trường hợp đó, tệp sẽ được biên dịch và phương thức chính được gọi là . Điều này cung cấp một cầu nối giữa các tập lệnh và nguồn scala tiêu chuẩn .

Tùy chọn cho plugin 'continuations':
-P: continuations: enable Enable continuations

0

Nếu bạn đang ở trên một số hương vị của Unix, bạn có thể chạy một kịch bản Scala như một kịch bản shell bởi đang chờ thêm pound bang chỉ thị ở đầu tệp.

Ví dụ, gõ như sau vào một file có tên helloarg:

#!/bin/sh 
exec scala "$0" "[email protected]" 
!# 
// Say hello to the first argument 
println("Hello, "+ args(0) +"!") 

Các ban đầu #!/bin/sh phải là dòng đầu tiên trong file.
Khi bạn thiết lập quyền thực thi của nó:

$ chmod +x helloarg 

Bạn có thể chạy các script Scala như một kịch bản shell bằng cách đơn giản nói:

$ ./helloarg globe 

Nếu bạn đang ở trên Windows, bạn có thể đạt được hiệu quả tương tự bằng cách đặt tên cho tệp helloarg.bat và đặt ở đầu tập lệnh của bạn:

::#! 
@echo off 
call scala % 0 % * 
goto :eof 
::!# 
Các vấn đề liên quan