2009-06-03 55 views
80

Với dấu bằng:Khi nào sử dụng dấu bằng trong khai báo phương thức Scala?

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

Nếu không có dấu bằng:

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

Cả hai chương trình trên thực hiện theo cùng một cách. Trong bài đăng blog Things I do not like in Scala Tôi đọc rằng khi dấu bằng bị thiếu, phương thức sẽ trả về Unit (giống như Java void), vì vậy các phương thức trả về giá trị phải sử dụng dấu bằng. Nhưng các phương thức không trả về một giá trị có thể được viết theo một trong hai cách.

Cách tốt nhất để sử dụng dấu bằng trong phương thức Scala không trả về giá trị là gì?

Trả lời

103

Tôi thực sự không đồng ý khá mạnh với Daniel. Tôi nghĩ cú pháp không bằng nhau nên không bao giờ sử dụng. Nếu phương pháp của bạn đang được tiếp xúc như một API và bạn đang lo lắng về tình cờ trở về các loại sai, thêm một loại chú thích rõ ràng:

object HelloWorld { 
    def main(args: Array[String]): Unit = { 
    println("Hello!") 
    123 
    } 
} 

Cú pháp phi bình đẳng là ngắn hơn và có thể trông "sạch", nhưng tôi nghĩ rằng nó chỉ thêm khả năng nhầm lẫn. Đôi khi tôi quên để thêm một dấu bằng và tin rằng phương pháp của tôi đã trở lại một giá trị khi thực sự nó đã trở về Đơn vị. Bởi vì các cú pháp kiểu không bằng nhau và bằng-với-được suy ra tương tự về mặt trực quan nên rất dễ bỏ sót vấn đề này.

Mặc dù chi phí cho tôi nhiều công việc hơn một chút, tôi thích chú thích loại rõ ràng hơn khi chúng quan trọng (cụ thể là giao diện tiếp xúc).

+1

Tôi thích cách tiếp cận này, nó rõ ràng hơn và do đó rõ ràng hơn đối với người đọc. –

+4

Dường như bây giờ là kiểu được đề xuất (http://docs.scala-lang.org/style/declarations.html#procedure_syntax) vì vậy tôi thay đổi điều này thành câu trả lời được chấp nhận. –

+1

Tôi đồng ý với điều đó, tôi nghĩ rằng cú pháp mà không có = nên được loại bỏ hoàn toàn khỏi ngôn ngữ –

41

CẬP NHẬT: bằng Scala-2.10, sử dụng dấu bằng được ưu tiên. Câu trả lời cũ:

Phương thức trả lại Unit nên luôn luôn sử dụng cú pháp không bằng. Điều này tránh được những sai lầm tiềm ẩn trong việc triển khai chuyển sang API. Ví dụ: bạn có thể vô tình làm điều gì đó như thế này:

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

Ví dụ tầm thường tất nhiên, nhưng bạn có thể thấy đây có thể là vấn đề. Vì biểu thức cuối cùng không không phải là trả lại Unit, chính phương thức đó sẽ có loại trả lại khác với Unit. Điều này được hiển thị trong API công khai và có thể gây ra các sự cố khác trên đường. Với cú pháp không bằng, không quan trọng biểu thức cuối cùng là gì, Scala sửa kiểu trả về là Unit.

Nó cũng có hai ký tự sạch hơn. :-) Tôi cũng có xu hướng nghĩ rằng cú pháp không bằng nhau làm cho mã chỉ dễ đọc hơn một chút. Rõ ràng là phương pháp được đề cập trả về Unit hơn là một số giá trị hữu ích.

Trên một lưu ý liên quan, có một cú pháp tương tự cho các phương pháp trừu tượng:

trait Foo { 
    def bar(s: String) 
} 

Phương pháp bar có chữ ký String=>Unit. Scala thực hiện điều này khi bạn bỏ qua chú thích kiểu trên một thành viên trừu tượng. Một lần nữa, điều này là sạch hơn, và (tôi nghĩ) dễ đọc hơn.

+3

Không sử dụng dấu bằng cũng là đề xuất trong Hướng dẫn kiểu Scala: http://davetron5000.github.com/scala-style/types/inference/void_methods.html –

+5

Tôi đã viết bit đó, vì vậy bạn có thể nên giữ khi bạn cân nhắc tham chiếu. :-) –

+0

LoL, vì vậy tôi đã mô tả sự trao đổi nhỏ này với bạn gái của tôi, ngoại trừ do sự xuất hiện tội nghiệp của tôi "bit" xuất hiện như "chó cái". Không cần phải nói, hài kịch sau đó. – Saem

12

Bạn phải sử dụng bằng cách khai báo cuộc gọi đăng nhập ngoại trừ các định nghĩa trả về Đơn vị.

Trong trường hợp sau này, bạn có thể bỏ dấu bằng. Cú pháp này có thể không được chấp nhận, vì vậy tốt nhất nên tránh. Sử dụng dấu bằng và khai báo kiểu trả về sẽ luôn hoạt động.

+0

làm thế nào bạn có thể biết tất cả điều này? '___' tôi muốn biết .. – Kokizzu

+0

Sách, danh sách gửi thư, mã nguồn. Nhân tiện, kể từ thời điểm đó nó trở nên rõ ràng rằng cú pháp thứ hai là không thể không được chấp nhận, và nó được ưa chuộng bởi nhiều người. –

+1

http://docs.scala-lang.org/style/types.html#function_values ​​Dường như hướng dẫn kiểu kiểu cho biết sử dụng = mọi lúc. – BeepDog

0

Một điều: hãy tưởng tượng câu lệnh cuối cùng của phương thức sẽ trả về Đơn vị không trả về Đơn vị. Sử dụng cú pháp không bằng nhau sau đó rất thuận tiện, tôi hy vọng điều này sẽ không được dùng nữa vì tôi thấy một số trường hợp sử dụng cho nó

0

Thời gian như tiến trình mặc định đã thay đổi và điều này đã được đề cập trong nhiều nhận xét để trả lời, bạn nên sử dụng số official style guide để sử dụng cú pháp = cho khai báo hàm.

+1

Liên kết bạn chỉ cung cấp các cuộc đàm phán về các chức năng chứ không phải các thủ tục (tức là các hàm trả về Đơn vị). –

+0

Bạn nói đúng, @EskoLuontola, Xin lỗi về điều đó, tôi có thể đã sao chép liên kết sai ra khỏi một trong nhiều tab tôi đã mở, nó đã được cập nhật. – BeepDog

3

Đối với phương pháp này, Scala Style Guide khuyến cú pháp bình đẳng như trái ngược với cú pháp thủ tục

Thủ tục Cú pháp

Tránh cú pháp thủ tục, vì nó có xu hướng thể gây nhầm lẫn cho rất ít lợi ích trong ngắn gọn .

// don't do this 
def printBar(bar: Baz) { 
    println(bar) 
} 
// write this instead 
def printBar(bar: Bar): Unit = { 
    println(bar) 
} 
0

cho phương pháp mà không có một giá trị trả về, một cách để thể hiện phương pháp đó được rời ra loại kết quả và dấu bằng, theo phương pháp với một khối lệnh được bao trong dấu ngoặc nhọn. Trong biểu mẫu này, phương thức trông giống như một thủ tục, một phương thức được thực hiện chỉ cho các tác dụng phụ của nó.

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