Ruby文件重命名和if语法

时间:2016-09-08 11:50:59

标签: ruby file if-statement syntax rename

我有两个关于图片下载程序的问题,请参阅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!'

编辑:进一步尝试,我遇到问题的代码工作。请原谅我创造一个令人困惑的情况。我确实非常感谢你的回答,并发现它们很有帮助。

1 个答案:

答案 0 :(得分:3)

1

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"

2

to_s上拨打gets.chomp完全没有意义,绝对没有任何意义,因为gets.chomp已经是String的实例。

我相信,它与资本S失败的原因是与操作系统相关的原因,因为你在Windows上并且知道这个操作系统会因文件名的情况而感到沮丧。

3

整个剧本看起来像是由对红宝石知识非常有限的人写的,因此,我会在三重关怀的真实照片上使用它。