我开始学习Chef来管理我们的服务器,我偶然发现了一个非常奇怪的(在我看来)
Ruby中的行为.我不认识
Ruby,所以这可能只是我的一个误解.
我得到的error是
`delete': Permission denied - [some path]/Metadata.json (Errno::EACCES)
因为我确定它实际上并不是关于权限,所以下一个合乎逻辑的事情是检查文件锁定.在通过相关代码挖掘了一下之后,我发现有一种方法可以为每个文件生成校验和.
> load_root
> file_metadata
> checksum
> md5_checksum_for_file
> generate_md5_checksum_for_file
> checksum_file
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时:
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.
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 }
希望我回答你的问题!!!