Home > Scala > Scala : 作用域中的变量,容器

Scala : 作用域中的变量,容器

Functions Bound to Variables in Scope

函数被绑定到创建函数时所在的作用域内中的变量,这样就允许承载状态,例如首先声明一个名为 foo 的变量:

scala> val foo = "dog"
foo: java.lang.String = dog

下面创建一个引用了这个变量的函数:

scala> val whoTo = (s: String) => s+" "+foo
whoTo: (String) => java.lang.String = <function1>

调用这个函数:

scala> whoTo("I love my")
res0: java.lang.String = I love my dog

scala> whoTo("I walk my")
res1: java.lang.String = I walk my dog

函数可以绑定于vars 或 vals ,甚至可以修改vars,首先,创建一个var strs,它是一个 List[String]:

然后创建一个以String为参数并返回String的函数,并且它能修改strs:

scala> var strs: List[String] = Nil
strs: List[String] = List()

scala> val strF = (s: String) => {strs ::= s; s+" Registered"}
strF: (String) => java.lang.String = <function1>

调用这个函数:

scala>  strF("a")
res2: java.lang.String = a Registered

scala> strF("b")
res3: java.lang.String = b Registered

scala> strs
res4: List[String] = List(b, a)

把这个函数作为参数:

scala> List("p", "q", "r").map(strF)
res5: List[java.lang.String] = List(p Registered, q Registered, r Registered)

scala> strs
res6: List[String] = List(r, q, p, b, a)

可以看到每一步都正确地更新了 strs。

Putting functions in Containers

函数就是实例,因此对实例的所有操作也可以在函数上进行。下面创建一个函数bf,接收一个Int 作为参数并返回一个函数:

scala> def bf: Int => Int => Int = i => v => i + v
bf: (Int) => (Int) => Int

下面创建一个1到100的序列,并用map遍历:

scala> val fs = (1 to 100).map(bf).toArray
fs: Array[(Int) => Int] = Array( <function1>,<function1> ,<function1> ...)

这样得到了100个函数,下面取得第一个元素,并且apply 1:

scala> fs(0)(1)
res7: Int = 2

同样的,它也适用于其它函数:

scala> fs(44)(3)
res8: Int = 48

在理论上来说,函数可以像实例一样操作是很好的特性,把函数放在Maps或Lists也有实际的应用。函数代表着一个代码块,在一个绑定于特定作用域的上下文中执行一些指令。为将函数绑定到事件(例如用户点击屏幕上的一个按钮 ),提供了一个强大的途径来构建交互式的基于事件的应用程序。

Related posts:

  1. Scala : Functions and Parameters
  2. Scala : Partial Functions 和 Type Parameters
  3. Scala 集合框架:Tuple,Map[K,V],Option[T]
  4. Scala 集合框架:List
  5. Scala : 交互式应用程序,函数组合
Categories: Scala Tags:
  1. No comments yet.
  1. No trackbacks yet.