在什么情况下我应该使用Array(Buffer)和List(Buffer).我所知道的唯一区别是数组是非变量的,列表是协变的.但是性能和其他一些特性呢?
我有我认为处理队列最常见的情况.我将读取队列的前面,对元素执行操作(这可能会导致更多元素添加到队列中),然后循环直到队列为空.
foreach,但是没有,显然一个队列(甚至是一个可变的队列)是严格的,并且当迭代开始时,foreach循环遍历队列中的所有元素.while循环的语法.你会认为它会是这样的
while (!q.isEmpty) {
var (e, q) = q.dequeue
... }
Run Code Online (Sandbox Code Playgroud)
会工作,除了我重新宣布q.这确实有效:
while (!q.isEmpty) {
var (e, q1) = q.dequeue
q = q1
... }
Run Code Online (Sandbox Code Playgroud)
但男人,看起来不对 ......
是否有一种本地方法可以确保变量只能设置一次?
目前,我正在使用这种方法
class SetOnceVariable[T]
{
private var value : T = _
private var initialized = false
def apply(_v : T = _) : T =
{
if (value != null && !initialized) {
value = _v
initialized = true
}
value
}
}
class ClientInfo
{
val userIP : SetOnceVariable[String] = new SetOnceVariable[String]
}
Run Code Online (Sandbox Code Playgroud) 我开始玩Scala,我读到的第一件事就是vals:
分配一次且永不改变的变量,以及可能在其生命周期内发生变化的变量
但我很好奇为什么我能做到这一点:
val foo = Array(1, 3 ,2)
scala.util.Sorting.quickSort(foo)
Run Code Online (Sandbox Code Playgroud)
如果我检查foo变量现在是有序的,这意味着它已经改变了......如果我打印(foo),两者都有相同的,所以变量指向同一个对象(我本可以认为变量只是指向一个新对象)
任何人都可以澄清吗?
我在函数外声明了一个变量,如下所示:
var s: Int = 0
Run Code Online (Sandbox Code Playgroud)
通过它如下:
def function(s: Int): Boolean={
s += 1
return true
}
Run Code Online (Sandbox Code Playgroud)
但是对于我的生活,错误线不会在"s + ="之下消失.我尝试了一切.我是Scala bww的新手.
我将java Pojo实例变量设置为'val'并在初始化后更改其状态.这会引起任何问题,因为它真的是'var'吗?
val st = new Pojo();
st.setInt(0);
Run Code Online (Sandbox Code Playgroud) 我试图找出在Scala中声明函数时def和之间的区别var/val.
假设我们有一个功能:
scala> def f(x: Int) = { x * 2 }
f: (x: Int)Int
Run Code Online (Sandbox Code Playgroud)
另一个功能g:
scala> var g = (x:Int) => x*2
g: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
显然它们在以下方面是相同的:
scala> f(2)
res0: Int = 4
scala> g(2)
res1: Int = 4
Run Code Online (Sandbox Code Playgroud)
但是,我能做到
g = f
g: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
但不是
scala> f = g
<console>:13: error: missing arguments for method f;
follow this method with `_' if you want to treat it as …Run Code Online (Sandbox Code Playgroud) 文档说:
保证scala.collection.immutable包中的集合对每个人都是不可变的。这样的集合在创建后将永远不会改变。
但是我没有得到我期望的行为:
scala> var test3 = scala.collection.immutable.Set[String]("one", "two")
test3: scala.collection.immutable.Set[String] = Set(one, two)
scala> test3 += "three"
scala> println(test3)
Set(one, two, three)
Run Code Online (Sandbox Code Playgroud)
我在这里想念什么?
我正在学习函数式编程,我能理解为什么不变性比可变对象更受欢迎。
这篇文章也解释的很好。
但我无法理解为什么应该在纯函数内部执行赋值。
我能理解的一个原因是变量可变性导致锁定,因为在 Scala 中的纯函数中,我们主要是尾递归,这会在调用堆栈而不是堆上创建变量/对象。
在函数式编程中应该避免变量赋值还有什么其他原因。
我是Scala初学者并开始经历"Scala编程".我遇到了以下代码.
for (arg <- args)
println(arg)
Run Code Online (Sandbox Code Playgroud)
在书中它说arg是val类型而不是var.为什么会如此.
根据我对每次迭代的理解,arg的值会发生变化,因为每次循环时它都会保持新的值.
以下是我的问题
我也知道scala中var和val之间的区别.我已经看过这个链接.Scala中var和val定义有什么区别?