我是Scala世界的新手,现在我正在阅读名为"Scala in Action"的书(Nilanjan Raychaudhuri),即第97页的"可变对象需要不变"的部分,我不明白以下部分直接来自上述书籍.
假设ListBuffer是协变的,以下代码片段在没有任何编译问题的情况下工作:
scala> val mxs: ListBuffer[String] = ListBuffer("pants")
mxs: scala.collection.mutable.ListBuffer[String] =
ListBuffer(pants)
scala> val everything: ListBuffer[Any] = mxs
scala> everything += 1
res4: everything.type = ListBuffer(1, pants)
Run Code Online (Sandbox Code Playgroud)
你能发现问题吗?因为所有内容都是Any类型,所以可以将整数值存储到字符串集合中.这是一场等待发生的灾难.为了避免这些问题,使可变对象不变是一个好主意.
我会有以下问题..
1)everything实际上是什么类型的?String还是Any?声明是" val everything: ListBuffer[Any]",因此我会期望Any,因为一切都应该是类型Any然后我没有看到任何问题,Integer并且String在一个ListBuffer[Any].如何将整数值存储到字符串集合中如何写?为何灾难??? 我为什么要使用List(不可变)而不是ListBuffer(可变)?我没看见有分别.我找到了很多答案,可变集合应该具有类型不变量,并且不可变集合应该具有协变类型,但为什么呢?
2)最后一部分res4: everything.type = ListBuffer(1, pants)是什么意思?"everything.type"是什么意思?我猜这里everything没有任何方法/函数或变量调用type..为什么没有ListBuffer [Any]或ListBuffer [String]?
非常感谢,
安德鲁
我想问您有关Python中以下简短函数的解释。
from zlib import crc32
def test_set_check(identifier, test_ratio):
return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32
Run Code Online (Sandbox Code Playgroud)
上述功能应与以下功能相同:
import hashlib
def test_set_check(identifier, test_ratio, hash=hashlib.md5):
return hash(np.int64(identifier)).digest()[-1] < 256 * test_ratio
Run Code Online (Sandbox Code Playgroud)
这两个函数都应用于数据采样(选择表中的某些行)。例如,如果test_ratio为0.2,则表示我要采样20%的数据,该值小于或等于51(256的20%)。我了解第二个功能的工作原理,但我不了解第一个功能。您能告诉我第一个功能吗?我不明白以下部分:crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32