加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:33:11 所属栏目:百科 来源:网络整理
导读:我开始学习Chef来管理我们的服务器,我偶然发现了一个非常奇怪的(在我看来) Ruby中的行为.我不认识 Ruby,所以这可能只是我的一个误解. 我得到的error是 `delete': Permission denied - [some path]/metadata.json (Errno::EACCES) 因为我确定它实际上并不是关
我开始学习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 }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读