我是第一次写 Ruby 代码,我想复习一下。查rubocop
了一下欧姆,他没有异议。
UPD:我写了rubocop rakefile
,但我应该有rubocop Rakefile
。更正了除行太长以外的所有内容。用字符串做什么?
任务:编写 rake 命令来创建文档文件模板。文件的标记和内容无关紧要。
文件头包含文档的日期YYYY Month DD
。标题上有一个锚链接,日期为YYYYMMDD
. 接下来,复制模板文件的内容。
是什么引起了我的怀疑:
- 我可以正确地读取和写入文件吗?
- 特别是,与其逐行重写文件,不如以某种方式完整复制它不值得吗?这有什么功能吗?
- 也许不是模板化字符串,而是将整个文件模板化会更好?在 Python 中,我会在这种情况下使用 Jinja。
- 我应该写一些帮助吗?还是每个人都会用
rake --tasks
?
代码Rakefile
:
require 'date'
desc 'Begin new release notes'
task :rnotes, [:date] do |_t, args|
if args.date
date = args.date
else
puts 'Enter the date for the release notes in YYYYMMDD format: '
date = STDIN.gets.chomp
end
filename = "release-notes/#{date}.md"
puts "Creating new release notes: #{filename}"
d = Date.strptime(date, '%Y%m%d')
longdate = d.strftime('%Y %B %d')
open(filename, 'w') do |release_notes|
release_notes.puts "## #{longdate} <a id=\"#{date}\" class=\"anchor\" href=\"#{date}\"></a>"
release_notes.puts ''
template = 'templates/rnotes.md'
File.readlines(template).each do |line|
release_notes.puts line
end
end
end
差不多好了,是的。
Kernel.open
如果您只打算用它打开文件,则应将(只是open
)替换为。File.open
对于from方法Kernel
不仅可以做到这一点。它还将
readlines
整个文件读入内存并返回已经组装好的字符串数组。可以使用更惰性的迭代器逐行读取文件,例如File#each_line
:这是一个不错的选择。Ruby 标准库有一个 ERB,其模板实际上由 Ruby 组成。但考虑到当前格式的复杂性,这样做的好处不大。只有当模式变得更加复杂时,过渡才会变得合理。
除了
desc
(你已经拥有的)之外,Rake 中没有资金。您可以在项目的自述文件或其他介绍性文档中放置类似的任务描述。现在不是关于问题:
最好避免使用缩写词 favor
release_notes
,除非它当然带有某些特殊含义。在 Ruby
if
中,它返回一个值(在每个作用域中,最后一个表达式的值成为返回值),因此像“if X
赋值一个else
赋值另一个”这样的模式通常被无条件赋值代替,但内部有一个条件表达式:...并且由于条件和第一个返回值相同,因此
if
成功替换为||
:“看我怎么做”
该技术对于 Ruby 而言相当不典型,但它确实有效。想要功能?这是给你的一些免积分风格:)
release_notes.method(:puts)
它是一种puts
固定在“所有者”(release_notes
) 上的方法。从技术上讲,它是Method
具有方法的类的对象,该方法call
的调用将导致在具有相同参数的相应对象上调用相应的方法。任何具有方法的对象
call
都可以通过提供一个符号来指示它不仅仅是一个参数,而是一个块(每次调用中只能是一个),而不是块传递给方法。我不推荐这个技巧,它并不常见,因为不经常使用它会使代码更具可读性。相比:
在这里,喜欢一切。也许我会找到别的东西。