Tại sao Scala sử dụng toán tử '_' để nhập gói thay vì '*' như trong Java?


17

Theo tôi, một trong những điều tuyệt vời nhất về Scala là khả năng tương tác với Java và cú pháp tương tự của nó. Một điều mà tôi thấy lạ là việc sử dụng _toán tử để nhập gói wilcard thay vì *toán tử được sử dụng trong Java.

Có một lý do kỹ thuật để sử dụng _thay vì *? Nếu không, tại sao thay đổi này được thực hiện?


Đây có thể chỉ là một điều chức năng. Tôi biết Haskell sử dụng _ ở một vài nơi để hoạt động như một ký tự đại diện / giá trị không được chỉ định.
KChaloux

Câu trả lời:


36

Trong Scala, *là một định danh hợp lệ. Người ta có thể viết:

val * = "trollin'"
println(*)

Với kết quả là:

trollin'

Người ta có thể viết một lớp có tên *như vậy:

class * {
  def test():String = {
    "trollin'"
  }
}

Vì vậy, với trường hợp đó, khi tôi có một lớp *trong gói us.hexcodervà tôi viết:

import us.hexcoder.*

Bạn sẽ nói rằng bạn muốn nhập một lớp với tên *. Do đó, Scala cần sử dụng một biểu tượng khác để biểu thị nhập ký tự đại diện. Vì lý do nào, họ quyết định sử dụng _làm biểu tượng ký tự đại diện.


9
Câu hỏi trở thành sau đó, tại sao * được chọn làm định danh hợp lệ và _ làm ký tự đại diện?
Mike Partridge

2
Mặc dù tôi có nhiều upvote hơn, đây là câu trả lời đúng hơn. Chưa bao giờ nghe nói về * như một định danh trước đây.
Michael Brown

1
@MikeBrown Nó cũng hợp lệ trong Lisp. Dưới đây là một ví dụ trong Scheme

18
@MikePatridge Gần như chắc chắn vì Scala định nghĩa tất cả các toán tử của nó là các hàm và cho phép nhà phát triển định nghĩa các toán tử của riêng chúng như vậy. Nó không thực hiện cú pháp trường hợp đặc biệt cho các toán tử và *cần được đưa vào để nhân. Vì vậy, một nhân vật ít phổ biến hơn cần được chọn là một nhân vật dành riêng.
KChaloux

3
Ký tự _ giống như một khoảng trống (như trong "điền vào chỗ trống"), do đó, dù Scala có mượn nó từ nơi nào khác hay tự mình nghĩ ra, thì cũng nên sử dụng nó làm ký tự đại diện.
Michael Shaw

13

Trong các ngôn ngữ chức năng, ký tự _ thường được sử dụng để nói, "Tôi không quan tâm đến tham số này" hoặc "bất cứ điều gì có thể đi đến đây". Mở rộng giá trị đó sang nhập không gian tên chỉ có ý nghĩa.


2

Ngoài câu trả lời của Glenn, importlà một tuyên bố hợp lệ ở bất cứ đâu trong Scala và bạn có thể đưa importmột đối tượng hoặc một thành viên thể hiện vào phạm vi. Vì *rõ ràng là một thành viên của nhiều lớp, nó không thể được sử dụng làm ký tự đại diện cho importcâu lệnh. Vì vậy, bạn kết thúc với một chuỗi không phải là một định danh hợp lệ.

_Nghĩ đến. Việc nó được sử dụng ở những nơi khác cho một ý nghĩa khác (loại tồn tại, chức năng như một thể hiện) cũng là do cùng một vấ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.