2009-12-02 29 views
47

Cho một hàm lấy số lượng đối số thay đổi, ví dụ:Scala: chuyển Seq thành các hàm var-args

def foo(os: String*) = 
    println(os.toList) 

Làm cách nào để chuyển một chuỗi đối số đến hàm? Tôi muốn viết:

val args = Seq("hi", "there") 
foo(args) 

Rõ ràng, điều này không hiệu quả.

+0

Xem thêm: http://stackoverflow.com/questions/1008783/using-varargs-from-scala –

Trả lời

93

foo(args:_*) thực hiện thủ thuật. Thay vì áp dụng chuỗi như một đối số duy nhất, mỗi phần tử trong chuỗi sẽ được sử dụng làm đối số.

+3

là có một tên dễ đọc, thân thiện với ít dễ bị đau đầu hơn đối với hàm trên '' 'args: _ *' '' – Richeek

+0

Một cách để cung cấp một api làm cho điều này minh bạch, là viết một hàm proxy có tên 'foo', mà làm cho việc chuyển đổi. Bằng cách đó, lệnh gọi ban đầu của bạn tới 'foo' sẽ hoạt động mà không cần mã người dùng của bạn phải lo lắng về điều đó. Có nói rằng, nếu 'foo' yêu cầu một bộ sưu tập như' Seq' chứ không phải kiểu nguyên thủy như 'Chuỗi', thì sự bất biến của các bộ sưu tập scala sẽ cản trở việc sử dụng api của bạn. Như thể các danh sách đối số biến và các bộ sưu tập thư viện chuẩn chưa được thiết kế cho các trường hợp sử dụng lẫn nhau ngoài vanilla. – matanster

+0

@Richeek Thật không may, không. – Malcolm

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