请检查一下
import scala.collection.mutable.LinkedList
var l = new LinkedList[String]
l append LinkedList("abc", "asd")
println(l)
// prints
// LinkedList()
Run Code Online (Sandbox Code Playgroud)
但
import scala.collection.mutable.LinkedList
var l = new LinkedList[String]
l = LinkedList("x")
l append LinkedList("abc", "asd")
println(l)
// prints
// LinkedList(x, abc, asd)
Run Code Online (Sandbox Code Playgroud)
为什么第二个代码片段有效,但第一个代码片段不起作用?这是在Scala 2.10上
如何在不创建任何新集合的情况下做到这一点 有比这更好的东西吗?
val m = scala.collection.mutable.Map[String, Long]("1" -> 1, "2" -> 2, "3" -> 3, "4" -> 4)
m.foreach(t => if (t._2 % 2 == 0) m.remove(t._1))
println(m)
Run Code Online (Sandbox Code Playgroud)
PS中的Scala 2.8
你能告诉我什么是可变位图吗?可变位图和不可变位图有哪些优点/缺点或限制.谢谢
我尝试构建(可变和不可变)集合的列表.编译器遇到麻烦,因为它无法弄清楚该列表的类型.我一直认为我可以连接任何类型的列表,并且新列表的类型是连接列表的一种超类型.在以下示例中,我定义了一些列表.您可以看到编译器给出的那些列表的类型:
val intList = List(1) //List[Int]
val stringList = List("ab") //List[java.lang.String]
val mSetList = List(mutable.Set(1, 2, 3)) //List[scala.collection.mutable.Set[Int]]
val iSetList = List(immutable.Set(1, 2, 3)) //List[scala.collection.immutable.Set[Int]]
Run Code Online (Sandbox Code Playgroud)
现在我使用:::运算符连接这些列表:
val intStringList = intList:::stringList //List[Any]
val intMSetList = intList:::mSetList //List[Any]
val intISetList = intList:::iSetList //List[Any]
Run Code Online (Sandbox Code Playgroud)
正如所料,编译器计算List[Any]两个列表的公共超类型().但以下不编译:
val iSetmSetList = iSetList:::mSetList //type error
Run Code Online (Sandbox Code Playgroud)
但是,如果我明确地"投射"这两个列表,它的工作原理是:
val setList1 : List[scala.collection.Set[Int]] = mSetList //List[scala.collection.Set[Int]]
val setList2 : List[scala.collection.Set[Int]] = iSetList // List[scala.collection.Set[Int]]
val setList = setList1:::setList2 //List[scala.collection.Set[Int]]
Run Code Online (Sandbox Code Playgroud)
为什么我必须帮助编译器获取该列表的正确类型?为什么它会产生错误而不是简单地输入List[Any]?从理论上讲,计算类型List[scala.collection.Set[Int]]是不可能的,还是编译器中的一种错误?
非常感谢你的回答 :-)
当说明mutable符用于非静态数据成员的声明时,无论对象的其余部分是否被视为const,数据都是可变的.有了这个事实,我们可能很容易产生这样的印象:mutable说明符与限定符是同一类const,事实证明这不是真的.实际上,该语言将mutable说明符分类为存储类说明符.这非常违反直觉,因为mutable它没有指定存储持续时间.
这个设计决定背后的理由是什么?
什么会使它不像它似乎mutable是一个限定符?
使其成为存储类说明符有什么好处?
c++ language-design mutable language-lawyer storage-class-specifier
我理解Python中可变对象和不可变对象之间的区别.我读了许多讨论差异的帖子.但是,我没有读过任何关于WHY整数是不可变对象的内容.
这有什么原因吗?或者答案是"它就是这样"?
编辑:我被提示将此问题与其他问题"区分",因为它似乎是一个先前提出的问题.但是,我相信我所要求的更多的是一个哲学上的Python问题,而不是一个技术性的Python问题.
似乎Python中的"原始"对象(即字符串,布尔值,数字等)是不可变的.我还注意到由基元(即dicts,列表,类)组成的派生数据类型是可变的.
无论对象是否可变,是否绘制线的位置?原始vs派生?
我无法在stackoverflow和Julia文档中找到以下"设计问题"的答案:
假设我想定义以下对象
struct Person
birthplace::String
age::Int
end
Run Code Online (Sandbox Code Playgroud)
既然Person是不可改变的,我很高兴没有人可以改变birthplace任何Person创造的,但是,这也意味着当时间过去,我无法改变他们的age......
另一方面,如果我将类型定义Person为
mutable struct Person
birthplace::String
age::Int
end
Run Code Online (Sandbox Code Playgroud)
我现在可以制作它们age,但我没有以前的安全性birthplace,任何人都可以访问并更改它.
到目前为止我找到的解决方法如下
struct Person
birthplace::String
age::Vector{Int}
end
Run Code Online (Sandbox Code Playgroud)
显然age是1元素Vector.
我发现这个解决方案非常难看并且绝对不是最理想的,因为每次都必须使用方括号访问年龄.
是否还有其他更优雅的方法在对象中包含不可变字段和可变字段?
也许问题是我错过了在一个内容中具有可变性或不可变性的真正价值struct.如果是这样的话,你能解释一下吗?
我正在使用BigIntegers进行计算,它使用一个调用multiply()大约1000亿次的循环,而BigInteger创建的新对象使得它非常慢.我希望有人写过或找到了一个MutableBigInteger类.我在java.math包中找到了MutableBigInteger,但它是私有的,当我将代码复制到一个新类时,会出现很多错误,其中大部分都是我不知道如何修复的.
像MutableBigInteger这样的Java类有哪些实现允许修改值?
以下代码在尝试removeObjectForKey时返回一个异常,并显示以下错误消息"mutating method sent to immutable object"
NSMutableDictionary * storedIpDictionary = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"dictDeviceIp"];
NSString *key = self.currentDeviceNameText.text;
NSString *ipAddressTemp = [storedIpDictionary objectForKey:key];
[storedIpDictionary removeObjectForKey:key]; <----Crashes here
storedIpDictionary[key] = ipAddressTemp;
Run Code Online (Sandbox Code Playgroud)
不确定是什么问题,也许是因为从NSUserDefaults检索字典.
但是,以下代码无任何问题.
NSMutableDictionary * storedIpDictionary = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"dictDeviceIp"];
[storedIpDictionary removeAllObjects];
Run Code Online (Sandbox Code Playgroud) 我想编写一个Python函数来改变其中一个参数(这是一个列表,即可变).像这样的东西:
def change(array):
array.append(4)
change(array)
Run Code Online (Sandbox Code Playgroud)
我更熟悉传递值而不是Python的设置(无论你决定调用它).所以我通常会写这样的函数:
def change(array):
array.append(4)
return array
array = change(array)
Run Code Online (Sandbox Code Playgroud)
这是我的困惑.由于我可以改变参数,第二种方法似乎是多余的.但第一个感觉不对.此外,我的特定功能将有几个参数,其中只有一个会改变.第二种方法清楚地说明了哪个参数正在改变(因为它被赋值给变量).第一种方法没有给出任何指示.有会议吗?哪个更好'?谢谢.
mutable ×10
immutability ×4
scala ×3
python ×2
android ×1
biginteger ×1
bitmap ×1
c++ ×1
collections ×1
ios ×1
java ×1
julia ×1
objective-c ×1
performance ×1
precision ×1
scala-2.8 ×1
struct ×1