2014-09-12 18 views
13

Tôi có một hàm gọi là or chẳng hạn, được định nghĩa là;Chuyển các phần tử của một Danh sách dưới dạng tham số đến một hàm có đối số biến số

or(filters: FilterDefinition*) 

Và sau đó tôi có một danh sách:

List(X, Y, Z) 

gọi or như

or(func(X), func(Y), func(Z)) 

gì bây giờ tôi cần phải làm là Và như mong đợi chiều dài của danh sách có thể thay đổi.

Cách tốt nhất để làm điều này trong Scala là gì?

+3

Không chính xác cùng một câu hỏi nhưng nó cung cấp ký pháp ': _ *' là chìa khóa cho câu trả lời (giả sử bạn có thể chỉ 'list.map (func)'!): Http://stackoverflow.com/questions/ 1008783 –

+0

Nếu chúng tôi vượt qua toàn bộ danh sách các yếu tố và xử lý tất cả chúng trong func được gọi là tion, sau đó nó cũng có thể được thực hiện bằng cách chỉ cần chuyển danh sách đến hàm và hàm có thể lặp qua các phần tử, mà không cần cú pháp đặc biệt của: _ *, phải không? Hoặc tôi có thể sai, có lý do chính đáng nào cho việc sử dụng này không? – user3366706

+0

@ user3366706 sẽ là cách tiếp cận truyền thống hơn để làm mọi thứ, vâng. Đối với tôi, điều này vô cùng tiện lợi khi xử lý một DSL dự kiến ​​một truy vấn được tạo ra làm đối số hàm - với số lượng đối số biến. – Ashesh

Trả lời

32

Hãy xem ví dụ này, tôi sẽ xác định một printme hàm mang theo vargs kiểu String

def printme(s: String*) = s.foreach(println) 


scala> printme(List("a","b","c")) 

<console>:9: error: type mismatch; 
found : List[String] 
required: String 
       printme(List(a,b,c)) 

Những gì bạn thực sự cần phải bỏ gói danh sách vào tranh cãi với các :_* hành

scala> val mylist = List("1","2","3") 
scala> printme(mylist:_*) 
1 
2 
3 
+0

Nó cũng làm việc với lớp: 'trường hợp lớp ExampleClass (d: Double *)' –

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