使用命名參數,用咖喱功能。我在那獲取塊使用4個參數的方法。在每個塊,第一個參數始終是相同的:如何在斯卡拉
// 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")
我想要一個快速的方法來創建每個塊的方法,這樣我只需要指定其他3個參數。目前我可以做到這一點:
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")
這種方法的問題是,我失去了我的命名參數。他們成爲v1
,v2
和v3
。使用命名參數,因爲類型的其他3個參數都是一樣的,因此很容易混淆在這種情況下非常重要。
有沒有乾淨的方式來定義一個fooCurried
功能像上面我可以很容易地在不同的情況下使用,但讓我用命名的參數?
我想的東西我可以用這樣的:
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")
提前感謝!在這裏你可以使用case class
嗯,我會說這是不討好部分應用程序。如果你想讓它變成咖啡,你可以將它定義爲例如'def foo(a:String)(b:String,c:String,d:String)= ???'。 –
@MateuszKubuszok是使用不正確的術語遺憾。在這種情況下,我不控制'foo',所以我不能用你所建議的格式來改變它。我可以做一個包裝。 – rmin