我有两个关于图片下载程序的问题,请参阅Chris Pine关于Ruby的书中的第108-109页。它应该是一个程序,将照片从相机(在我的情况下是D:/)移动到指定的文件夹,并根据需要重命名批处理。这是本书的代码,没有一些评论。这段代码是第11章的一部分,它非常简单。在本书的最后,作者已经包含了一个非常详细的,对于我来说也是如此复杂的程序示例,所以请不要将我的帖子作为作者没有正确的Ruby知识的标志。
Dir.chdir 'C:/Documents and Settings/Katy/PictureInbox'
# First we find all of the pictures to be moved.
pic_names = Dir['F:/**/*.{JPG,jpg}']
puts 'What would you like to call this batch?'
batch_name = gets.chomp
puts
print "Downloading #{pic_names.length} files: "
# This will be our counter.
pic_number = 1
pic_names.each do |name|
print '.' # This is our "progress bar".
new_name = if pic_number < 10
"batch_name0#{pic_number}.jpg"
else
"batch_name#{pic_number}.jpg"
end
File.rename name, new_name
# Finally, we increment the counter.
pic_number = pic_number + 1
end
puts # This is so we aren't on progress bar line.
puts 'Done, cutie!'
我的第一个问题是关于以下段落:
new_name = if pic_number < 10
"batch_name0#{pic_number}.jpg"
else
"batch_name#{pic_number}.jpg"
end
该程序没有为我运行,除非我将其更改为我熟悉的语法:
if pic_number < 10
new_name = "batch_name0#{pic_number}.jpg"
else
new_name = "batch_name#{pic_number}.jpg"
end
一切都很好。虽然由于某种原因它改变了照片的顺序。
我的问题是 - 书中提到的语法是错误的还是它不起作用的原因是不同的?这也是我在本书中使用的类似语法的第一个实例。
我遇到的另一个问题是我第一次将批次“索尼”命名为大写字母s,照片从相机中删除,并没有移动到文件夹(在我的情况下是C:/ CameraPhotos)。
当我试图将批次命名为“sony”时,它运行正常。之后我尝试将to_s添加到batch_name:“batch_name = gets.chomp.to_s”,它与大写字母S一起工作。这与Ruby中使用大写字母有什么关系,或者原因是不同的?< / p>
我的程序的最终代码是,以防万一:
Dir.chdir 'C:/CameraPhotos'
pic_names = Dir['D:/**/*.jpg']
puts 'What would you like to call hits batch?'
batch_name = gets.chomp.to_s
puts
print "Downloading #{pic_names.length} files: "
pic_number = 1
pic_names.each do |name|
print '.'
if pic_number < 10
new_name = "#{batch_name}0#{pic_number}.jpg"
else
new_name = "#{batch_name}#{pic_number}.jpg"
end
File.rename name, new_name
pic_number = pic_number + 1
end
puts
puts 'Done!'
编辑:进一步尝试,我遇到问题的代码工作。请原谅我创造一个令人困惑的情况。我确实非常感谢你的回答,并发现它们很有帮助。
答案 0 :(得分:3)
new_name = if pic_number < 10
"batch_name0#{pic_number}.jpg"
else
"batch_name#{pic_number}.jpg"
end
是一种完全有效的语法,但此代码可能(并且可能应该)简化为:
new_name = "batch_name#{'0' if pic_number < 10}#{pic_number}.jpg"
或者更好的是:
new_name = "batch_name#{pic_number.to_s.rjust(2, '0')}.jpg"
在to_s
上拨打gets.chomp
完全没有意义,绝对没有任何意义,因为gets.chomp
已经是String
的实例。
我相信,它与资本S
失败的原因是与操作系统相关的原因,因为你在Windows上并且知道这个操作系统会因文件名的情况而感到沮丧。
整个剧本看起来像是由对红宝石知识非常有限的人写的,因此,我会在三重关怀的真实照片上使用它。