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


85

Với dấu bằng:

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

Không có dấu bằng:

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

Cả hai chương trình trên đều thực thi theo cùng một cách. Trong bài đăng trên blog Những điều tôi không thích trong Scala, tôi đã đọc rằng khi thiếu dấu bằng, phương thức sẽ trả về Unit(giống như của 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ề giá trị có thể được viết theo cả hai cách.

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

Câu trả lời:


108

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

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

Cú pháp không bằng ngắn hơn và có thể trông "sạch" hơn, nhưng tôi nghĩ nó chỉ làm tăng 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 thức của tôi đang trả về một giá trị trong khi thực sự nó đang trả về Đơn vị. Vì các cú pháp kiểu không bằng và bằng với kiểu suy ra rất giống nhau về mặt hình ảnh, nên bạn rất dễ bỏ sót vấn đề này.

Mặc dù tôi tốn công hơn một chút nhưng tôi thích các chú thích kiểu rõ ràng khi chúng quan trọng (cụ thể là các giao diện lộ ra ngoài).


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 cho người đọc.
Lukasz Korzybski

4
Rõ ràng đó hiện là kiểu được đề xuất ( docs.scala-lang.org/style/decl Tuyên.html#procedure_syntax ) nên tôi đang thay đổi kiểu này thành câu trả lời được chấp nhận.
Esko Luontola,

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

7
Martin Odersky trong bài phát biểu quan trọng của mình "Scala với phong cách" nói rằng đó là một sai lầm lịch sử. Anh ấy phải thêm cú pháp này (không có =) để có thể ẩn "Unit" khỏi các nhà phát triển Java để họ không bị nhầm lẫn. Ngoài ra, ông cũng đề cập rằng nó sẽ bị loại bỏ trong tương lai.
tabdulradi

2
Có cách nào để CẢNH BÁO nếu dấu bằng bị quên trong định nghĩa phương pháp không? Ví dụ như một tùy chọn trình biên dịch hoặc trong bất kỳ công cụ phân tích nguồn nào?
VasiliNovikov

42

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

Các phương thức trả về Unitphải luôn sử dụng cú pháp không bằng. Điều này tránh những sai lầm có thể xảy ra khi triển khai chuyển sang API. Ví dụ: bạn có thể đã vô tình làm điều gì đó như sau:

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

Tất nhiên, ví dụ nhỏ nhặt, nhưng bạn có thể thấy đây có thể là một vấn đề. Vì biểu thức cuối cùng không trả về Unitnên bản thân phương thức sẽ có kiểu trả về 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. 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 sạch hơn hai ký tự. :-) Tôi cũng có xu hướng nghĩ rằng cú pháp không bằng làm cho mã dễ đọc hơn một chút. Rõ ràng hơn là phương thức được đề cập trả về Unitthay vì một giá trị hữu ích nào đó.

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

trait Foo {
  def bar(s: String)
}

Phương thức barcó 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 rõ ràng hơn và (tôi nghĩ) dễ đọc hơn.


3
Không sử dụng dấu bằng cũng là khuyến nghị trong Scala Style Guide: davetron5000.github.com/scala-style/types/inference/...
Esko Luontola

6
Tôi đã viết một chút đó, vì vậy bạn có thể nên ghi nhớ điều đó khi bạn cân nhắc tài liệu tham khảo. :-)
Daniel Spiewak

LoL, vì vậy tôi đã mô tả cuộc trao đổi nhỏ này với bạn gái của mình, ngoại trừ do phát âm kém "bit" của tôi bị phát ra là "bitch". Không cần phải nói, hài kịch đã xảy ra sau đó.
Saem

10
ScalaDays 2013, Martin Odersky, Keynote - Scala with Style chương 45 : nên tránh khai báo thủ tục (cú pháp không bằng).
senia

4
Hướng dẫn kiểu chính thức không khuyến nghị điều này nữa: docs.scala-lang.org/style/decl Tuyên.html#procedure_syntax
sbilstein

12

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

Trong trường hợp thứ hai này, bạn có thể bỏ qua dấu bằng. Tuy nhiên, cú pháp này có thể không được dùng nữa, vì vậy tốt nhất bạn 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.


Sách, danh sách gửi thư, mã nguồn. Nhân tiện, kể từ thời điểm đó, rõ ràng là cú pháp thứ hai không thể bị phản đối và nó được nhiều người ưa thích.
Daniel C. Sobral

1
docs.scala-lang.org/style/types.html# Chức năng_values Có vẻ như hướng dẫn kiểu kiểu cho biết vẫn sử dụng = mọi lúc.
BeepDog

4

Đối với các phương thức, Scala Style Guide đề xuất cú pháp bằng thay vì cú pháp thủ tục

Cú pháp thủ tục

Tránh cú pháp thủ tục, vì nó có xu hướng gây nhầm lẫn cho rất ít lợi ích 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

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


0

Theo thời gian, kiểu mặc định đã thay đổi và điều này đã được đề cập đến trong nhiều phần nhận xét cho câu trả lời, nên trong hướng dẫn kiểu chính thức nên sử dụng =cú pháp cho khai báo hàm.


1
Liên kết bạn cung cấp chỉ nói về các hàm chứ không phải các thủ tục (tức là các hàm trả về Đơn vị).
Esko Luontola,

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

0

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.