2014-09-01 37 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

相关问题