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:
评论