2014-09-01 79 views
1

用JavaScript我可以做這樣的事情:如何在scala函數中傳遞參數對象?

var parameters = {} 
for (object in objects) { 
    if (someCondition(object)) { 
     parameters.[object.getName()] = object.getValue(); 
    } 
} 
myFunction(parameters) 

的想法是收集參數,並通過他們的對象不是數組的函數(!)。 scala如何做類似的事情?

+0

參數[object.getName()是錯誤的......沒有必要使用參數 – 2014-09-01 07:48:42

回答

0

嘗試使用案例類。定義默認值作爲默認參數。

case class Parameters(
    param1:String = "a" 
    param2:Int = 1 
) 

val params = Parameters("b", 2) 
myFunction(params) 

val paramsWithDefault = Parameters() 
myFunction(paramsWithDefault) 

你可以像使用Scala的內置特性(case類和默認值)的jQuery $.extend行爲。但實際上,JavaScript是一種動態語言,您可以在其中合併對象,其中scala是靜態的。你可以在編譯時定義你的對象。所以我們在這裏做的並不是完全合併對象。

此外,爲了清晰的代碼,使用parameter objects在scala中並不常見。

+0

如果什麼後點'myFunction'已經在案例類? :) – Cherry 2014-09-01 09:27:10

+0

不在參數的情況下,我想。 「myFunction」在哪裏並不重要。 – tiran 2014-09-01 09:33:03

1

這就是Map的用途。在JavaScript中,我們對「記錄」和「字典」交換使用對象。在Scala和大多數靜態類型的語言中,我們使用Map代替字典用例。與JS字典相比,Map的一個優點是密鑰可以是與String不同的類型。

所以我會翻譯你的例子爲以下,與ObjClass是班級的object S的:

import scala.collection.mutable 

val parameters = mutable.Map.empty[String, ObjClass] 
for (obj <- objects) { 
    parameters(obj.name) = obj.value 
} 
myFunction(parameters) 

注意,上面是非常必要的,並且可以在一個更實用的風格像這樣被改寫:

val parameters = (
    for (obj <- objects) 
    yield obj.name -> obj.value 
).toMap 
+0

目標是使用1或2或更多參數調用myFunction,而不是將Map或元組對象傳遞給它。 val參數=(for(obj < - objects)yield obj.name - > obj.value).toMap'返回一個Map不是參數對象。 – Cherry 2014-09-01 09:26:38

+0

@Cherry你的'參數'對象的行爲基本上和一個關聯數組一樣,它在Scala中被實現爲'Map'。你會得到同樣的行爲,但是失去的是靜態類型推理和驗證,這是靜態類型語言的主要優點之一。 – 2014-09-01 09:53:02

+0

@Cherry那我不明白。 「myFunction」的定義是什麼? – sjrd 2014-09-01 10:51:41

相關問題