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

前端之家收集整理的这篇文章主要介绍了在Ruby中使用不同的闭包类型时奇怪的File.open行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我开始学习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 }

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

猜你在找的Ruby相关文章