Đối với người dùng Python:
_*
Toán tử của Scala tương đương với toán tử * của Python .
Thí dụ
Chuyển đổi ví dụ về scala từ liên kết do Luigi Plinge cung cấp :
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
sang Python sẽ giống như sau:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
và cả hai đều cho kết quả sau:
Có gì
lên
doc?
Sự khác biệt: giải nén các tham số vị trí
Trong khi *
-operator của Python cũng có thể xử lý việc giải nén các tham số / tham số vị trí cho các hàm fixed-arity:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
số 8
Làm tương tự với Scala:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
sẽ thất bại:
không đủ đối số cho phương thức nhân: (x: Int, y: Int) Int.
Tham số giá trị không xác định y.
Nhưng có thể đạt được điều tương tự với scala:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
Theo Lorrin Nelson, đây là cách nó hoạt động:
Phần đầu tiên, f _, là cú pháp của một hàm được áp dụng một phần trong đó không có đối số nào được chỉ định. Điều này hoạt động như một cơ chế để có được một đối tượng chức năng. tupled trả về một hàm mới của arity-1 nhận một tuple arity-n duy nhất.
Đọc thêm:
def sum(xs: _*)
ném 'lỗi: không ràng buộc kiểu ký tự đại diện'