gpt4 book ai didi

java - 字段方法不适用于多个子 block

转载 作者:行者123 更新时间:2023-11-30 09:02:33 24 4
gpt4 key购买 nike

这段java代码是从网上得到的

import java.util.zip.CRC32;

public static short getCRC(String s, int i, byte bytes[])
{
CRC32 crc32 = new CRC32();
if (s != null)
{
for (int j = 0; j < s.length(); j++)
{
char c = s.charAt(j);
crc32.update(c);
}
}
crc32.update(i);
crc32.update(i >> 8);
crc32.update(i >> 16);
crc32.update(i >> 24);
for (int k = 0; k < bytes.length; k++)
{
byte byte0 = bytes[k];
crc32.update(byte0);
}
return (short) (int) crc32.getValue();
}

我试着将它翻译成 Clojure:

(defn getCRC [s i bytes]
(let [crc32 (CRC32.)]
(if (not= s nil)
(for [c s] (.update crc32 (int c)))
)
(map #(.update crc32 (int (bit-shift-right i %))) [0 8 16 24])
(for [c bytes]
(.update crc32 (int c))
)
(.getValue crc32)
)
)

但似乎 .update 不起作用并且函数返回 0。
我评估了 let 主体中的每个 block ,它工作正常。
我还在 .getValue 之前放了另一个 .update 和一个数字,它工作正常,函数的返回值变成它的 CRC32;
但是当我将它们捆绑在一起时,返回值再次变为 0。

非常感谢任何帮助或想法!

最佳答案

问题在于formap产生惰性序列。

由于您不会在代码中的任何地方强制使用它们的结果,因此不会实现序列,并且永远不会调用 .update

尝试将两者都替换为 doseq - 一种专门处理副作用的迭代形式(除其他外,它不是懒惰的)并查看它如何改变结果:

(defn getCRC [s i bytes]
(let [crc32 (CRC32.)]
(if (not= s nil)
(doseq [c s] (.update crc32 (int c)))
)
(doseq [x [0 8 16 24]] (.update crc32 (int (bit-shift-right i x))))
(doseq [c bytes]
(.update crc32 (int c))
)
(.getValue crc32)
)
)

关于java - 字段方法不适用于多个子 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com