- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Nim in Action 的第 114 页定义自定义哈希函数的示例中,!$
运算符用于“最终确定计算的哈希值”。
import tables, hashes
type
Dog = object
name: string
proc hash(x: Dog): Hash =
result = x.name.hash
result = !$result
var dogOwners = initTable[Dog, string]()
dogOwners[Dog(name: "Charlie")] = "John"
在下面的段落中:
The
!$
operator finalizes the computed hash, which is necessary when writing a customhash
procedure. The use of the$!
operator ensures that the computed hash is unique.
我无法理解这一点。 “完成”某事是什么意思?在这种情况下确保某物是独一无二的意味着什么?
最佳答案
如果不阅读 !$
运算符的单一描述,而是看一下 beginning of the hashes module documentation,您的问题可能会得到解答。 .如您所见,原始数据类型有一个 hash()
过程,它返回它们自己的散列。但是如果你有一个包含很多变量的复杂对象,你可能想为对象本身创建一个散列,你该怎么做呢?无需深入研究哈希理论,也无需将哈希视为黑盒,您需要使用两种过程来生成有效的哈希:addition/concatenation operator。和 finalization operator .因此,您最终使用 !&
将各个散列添加(或混合)到一个时间值中,然后使用 !$
来最终确定时间值转换为最终哈希。如果 Dog 对象有多个变量,那么 Nim in Action 示例可能更容易理解,因此需要使用两个运算符:
import tables, hashes, sequtils
type
Dog = object
name: string
age: int
proc hash(x: Dog): Hash =
result = x.name.hash !& x.age.hash
result = !$result
var dogOwners = initTable[Dog, string]()
dogOwners[Dog(name: "Charlie", age: 2)] = "John"
dogOwners[Dog(name: "Charlie", age: 5)] = "Martha"
echo toSeq(dogOwners.keys)
for key, value in dogOwners:
echo "Key ", key.hash, " for ", key, " points at ", value
至于哈希值为什么临时连接然后最终确定,这在很大程度上取决于 Nim 开发人员选择使用哪种算法进行哈希。可以看到from the source code哈希连接和最终确定主要是位移。不幸的是,源代码没有解释或指出任何其他引用来理解为什么这样做以及为什么选择这种特定的哈希算法而不是其他算法。您可以尝试询问 Nim forums为此,也许可以根据您的发现改进文档/源代码。
关于nim-lang - Nim 中的 !$(bang dollar)运算符是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48187132/
在使用 Kent Becks Book TDD by Example 时,我遇到了一些我不理解的 Java 代码。 public boolean equals(Object object) {
我在名为 validate 的函数中声明了一个名为 cont 的局部变量。 我正在从验证内部调用函数进程。 我将字符串“cont”作为参数发送给验证函数。 在使用字符串 'cont' 的过程函数中,我
Dollar dollar= (Dollar) object; 这段代码有什么作用?它甚至是Java吗?还是小话?我在 TDD 中找到了它,我认为它是在考虑 Smalltalk 的情况下编写的。 最佳
我的管道在 Jenkinsfile 的 sh """元素处失败。知道哪里出了问题吗? stage('Install dependencies') { when
我正在阅读作者 Kent Beck 所著的名为“示例测试驱动开发”的书。 我正在尝试在 php 中编写类似的函数,但不理解这些步骤。 原始函数: 测试函数: public void testEqual
shell 有一个很棒的特性,当你使用“$@”时,它会在变量扩展中保留参数引用,这样脚本: for f in "$@"; do echo "$f"; done 当带参数调用时: "with space
有什么方法可以在参数扩展上下文中使用 !$ 吗?激发这个问题的理想用法是快速(根据击键)更改文件名(例如,不是将文件名保存在变量中并执行 rsvg-convert $svg > ${svg/.svg/
我有一个严重的问题,一整天我都在寻找答案,但我找不到任何东西...... 我在做什么: 我正在尝试让用户登录我的网站(在 php 中)。 密码和用户保存在我服务器上的 MySQL 数据库中。 对于我使
我一直很困惑。例如,在 php 中我有 sql 语句 $qry = "select * from table where id = $id"; 现在我可以直接在引号内插入“$”还是必须使用 $qry
因此,我们向我们的团队下了一个小赌注,看是否可行。我输了。这是代码: using System; using System.Collections.Generic; using System.Linq
我有一个相当简单的问题。 大多数 美元符号引用中都有一个命名的 HTML 实体,这正是您所期望的; $. 但在其他引用文献中,这个缺失,并告诉您只有数字实体可用 ($)。 我记得,命名实体并不存在很长
我看过一个使用 powershell 设置文件时间戳(创建时间、lastaccesstime、lastwritetime)的示例: PS>$(get-item test.txt).lastwritet
我正在使用 kable 格式化表格用于布局和 scales::dollar向记录中添加美元符号。但是,有些记录是 NA我宁愿有一个 -在输出上比 $NA . 例如我会 scales::dollar(1
我正在开发一个已经发布的 perl 代码的新版本,并发现了这一行: $|++; 据我所知,$|与管道有关,如所解释的 in this link ,我明白这一点,但我无法弄清楚++ (加号)在这里意味着
为什么这行代码 当我的所有区域设置都设置为英国时,将结果输出为 $xx.xx。我希望它输出为 £xx.xx。有任何想法吗?我尝试了字符串格式的不同变体,包括 StringFormat={}{0:C}
在输出中,new_dollars总是显示美元数量,所以我不知道如何解决这个问题。请帮我找出问题所在。 int main(void) { int dollars, cents, count, n
我用 C 编写了一段基本代码来判断密码是否安全。它根据密码是否安全返回 0 或 1。当我在 ubuntu 中传递命令行参数时,它工作正常,除非密码包含 $ 符号。因此我编写了一个程序来输出所有参数,它
在 bash 中,() 和 $() 都创建了一个子 shell。 它们之间有什么区别?它们的典型用法是什么? 最佳答案 () 只是创建一个复合命令,运行括号内的命令。 $() 做同样的事情,但也替换了
bang dollar 好像是指最后一行命令行的最后一部分。 例如 $ ls -l .... something $ !$ -l bash: -l command not found 我可以找到很多
我有以下代码。 string pattern5 = "^ba$"; string myString5 = "badabyba"; bool match5 = Regex.IsMatch(myStrin
我是一名优秀的程序员,十分优秀!