在Ruby中使用不同的闭包类型时奇怪的File.open行为
我开始学习Chef来管理我们的服务器,我偶然发现了一个非常奇怪的(在我看来)
Ruby中的行为.我不认识
Ruby,所以这可能只是我的一个误解.
我得到的error是 `delete': Permission denied - [some path]/metadata.json (Errno::EACCES) 因为我确定它实际上并不是关于权限,所以下一个合乎逻辑的事情是检查文件锁定.在通过相关代码挖掘了一下之后,我发现有一种方法可以为每个文件生成校验和. > load_root 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 找到了,我搜索了一下,发现了一个关于在Ruby中关闭文件的answer,看起来代码实际上很好……但事实并非如此.我试图将方法改为 def checksum_file(file,'rb') do |f| checksum_io(f,digest) end end 有人可以解释两个版本的代码之间的区别吗? – 编辑 – 似乎只有在Windows中才会出现此问题,并且可能仅在使用ChefDK 0.3.0提供的ruby时:
解决方法
回答你的问题
> Block总是返回一些东西,所以最终结束并且{……}真的不重要这只是人事编程偏好. 第一个宗教说 当你有一个单行或单行块你会使用花括号如果你有一个多行块你会使用do和end. words.each { |word| puts word } # single line or single line block words.each do |word| # multi line block puts word p 1 end 第二种宗教说 如果你的块只是做了什么有副作用,你不关心你可能会做和返回的返回值 words.each do |word| puts word end 如果您关心返回值,那么您将使用{…} back_words = words.map{ |word| word.reverse } 希望我回答你的问题!!! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |