gpt4 book ai didi

ruby - 在 Ruby 中使用不同的闭包类型时奇怪的 File.open 行为

转载 作者:可可西里 更新时间:2023-11-01 13:14:31 26 4
gpt4 key购买 nike

我开始学习 Chef 来管理我们的服务器,但我在 Ruby 中遇到了一个非常奇怪的(在我看来)行为。我不了解 Ruby,所以这可能只是我的误解。

error我得到的是

`delete': Permission denied - [some path]/metadata.json (Errno::EACCES)

因为我确定这实际上与权限无关,所以下一个合乎逻辑的事情是检查文件锁定。在深入研究相关代码后,我发现有一种方法可以为每个文件生成校验和。

def checksum_file(file, digest)
File.open(file, 'rb') { |f| checksum_io(f, digest) }
end

def checksum_io(io, digest)
while chunk = io.read(1024 * 8)
digest.update(chunk)
end
digest.hexdigest
end

找到后,我搜索了一下,找到了一个 answer关于在 Ruby 中关闭文件,看起来代码实际上很好......但事实并非如此。我试图将方法更改为“ block 格式”并且它没有错误地工作:

def checksum_file(file, digest)
File.open(file, 'rb') do |f|
checksum_io(f, digest)
end
end

有人可以解释一下这两个版本的代码之间的区别吗?

-- 编辑--

似乎这个问题只发生在 Windows 中,并且可能只发生在使用 ChefDK 0.3.0 提供的 ruby​​ 时:

ruby 2.0.0p451 (2014-02-24) [i386-mingw32]

最佳答案

问题的答案

Can someone please explain the difference between the two versions of the code?

  • Block 总是返回一些东西,所以 do end and and { ... } 没关系这只是人事问题编程偏好。

  • 我要分发的 block 有两种不同的约定现在给你,你想信奉哪种宗教取决于你。

第一宗教这样说

当你有一个单行或单行 block 时,你会使用大括号如果你有一个多行 block ,你会使用doend

words.each { |word| puts word }  # single line or single line block

words.each do |word| # multi line block
puts word
p 1
end

第二宗教这样说

如果您的代码块只是简单地做一些有副作用的事情并且您不关心返回值,您可能会放置 do 和 end

words.each do |word|
puts word
end

如果您确实关心返回值,您会使用 { ... }

back_words = words.map{ |word| word.reverse }

希望我能回答你的问题!!!

关于ruby - 在 Ruby 中使用不同的闭包类型时奇怪的 File.open 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26298093/

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