2016-01-21 19 views
5

Tôi có một phương thức với 4 tham số được sử dụng trong các khối. Trong mỗi khối, thông số đầu tiên luôn giống nhau:Làm thế nào để sử dụng các tham số có tên với chức năng được thu thập trong scala

// Block 1 - first parameter always "A" 
foo(a="A", b="x", c="y", d="z") 
foo(a="A", b=".", c=",", d="-") 
foo(a="A", b="1", c="2", d="3") 

// Block 2 - first parameter always "B" 
foo(a="B", b="x", c="y", d="z") 
foo(a="B", b=".", c=",", d="-") 
foo(a="B", b="1", c="2", d="3") 

Tôi muốn tạo một phương pháp cho từng khối để tôi chỉ cần chỉ định 3 thông số khác. Hiện tại tôi có thể làm điều này:

def fooCurried(a: String) = foo(a, _: String, _: String, _: String) 

val fooA = fooCurreid("A") 
fooA("x", "y", "z") 
fooA(".", ",", "-") 
fooA("1", "2", "3") 

val fooB = fooCurried("B") 
fooB("x", "y", "z") 
fooB(".", ",", "-") 
fooB("1", "2", "3") 

Vấn đề với cách tiếp cận này là tôi mất thông số được đặt tên. Chúng trở thành v1, v2v3. Sử dụng các tham số được đặt tên là quan trọng trong trường hợp này vì các kiểu của 3 thông số khác giống nhau và do đó rất dễ trộn lẫn.

Có cách nào để xác định hàm fooCurried như ở trên mà tôi có thể sử dụng dễ dàng trong các ngữ cảnh khác nhau nhưng cho phép tôi sử dụng các tham số được đặt tên?

Tôi muốn một cái gì đó tôi có thể sử dụng như thế này:

def fooCurried(a: String) = ??? 

val fooA = fooCurreid("A") 
fooA(b="x", c="y", d="z") 
fooA(b=".", c=",", d="-") 
fooA(b="1", c="2", d="3") 

Cảm ơn trước!

+2

Vâng, tôi muốn nói đó là ứng dụng một phần không tách lạng bộ. Nếu bạn muốn nó được curried bạn sẽ xác định nó như ví dụ 'def foo (a: String) (b: String, c: String, d: String) = ???'. –

+0

@MateuszKubuszok Có lỗi vì đã sử dụng thuật ngữ không chính xác. Trong trường hợp này tôi không kiểm soát 'foo' vì vậy tôi không thể thay đổi nó bằng cách sử dụng định dạng bạn đã đề xuất. Tôi có thể làm cho một wrapper mặc dù. – rmin

Trả lời

4

Làm thế nào về điều này:

case class fooCurried(a: String) { 
    def apply(b: String, c: String, d: String) = { 
    // do something 
    println(a + "," + b + "," + c + "," + d) 
    } 
} 

Bạn có thể sử dụng nó như thế này:

scala> val fooA = fooCurried(a = "A") 
fooA: fooCurried = fooCurried(A) 

scala> fooA(b="B", c="C", d="D") 
A,B,C,D 

scala> fooA(b="x", c="y", d="z") 
A,x,y,z 
+0

Điều này cũng tránh được một lớp vô danh tốn kém – Clashsoft

+0

@Clashsoft Bạn có thể giải thích về ý nghĩa của bạn bằng cách tránh một lớp vô danh tốn kém không? – rmin

1

Một cách khác mà bạn có thể đang sử dụng case class:

case class Foo(a:String, b:String, c:String) 

val f = Foo(a="a", b="b", c="c") 
foo(f.copy(b ="b1", c="c1")) 

Nhưng sau đó bạn foo sẽ tham gia một lớp học như là đối số thay vì 4 nhiều chuỗi.

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