RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 647926
Accepted
Nick Volynkin
Nick Volynkin
Asked:2020-04-03 23:33:06 +0000 UTC2020-04-03 23:33:06 +0000 UTC 2020-04-03 23:33:06 +0000 UTC

使用 rake 构建文件模板

  • 772

我是第一次写 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
ruby
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    user181100
    2020-04-04T00:44:01Z2020-04-04T00:44:01Z

    我可以正确地读取和写入文件吗?

    差不多好了,是的。

    Kernel.open如果您只打算用它打开文件,则应将(只是open)替换为。File.open对于from方法Kernel不仅可以做到这一点。

    它还将readlines整个文件读入内存并返回已经组装好的字符串数组。可以使用更惰性的迭代器逐行读取文件,例如File#each_line:

    File.open(template) do |file|
      file.each_line do |line|
        release_notes.puts line
      end
    end
    

    也许不是模板化字符串,而是将整个文件模板化会更好?在 Python 中,我会在这种情况下使用 Jinja。

    这是一个不错的选择。Ruby 标准库有一个 ERB,其模板实际上由 Ruby 组成。但考虑到当前格式的复杂性,这样做的好处不大。只有当模式变得更加复杂时,过渡才会变得合理。

    我应该写一些help吗?还是每个人都会用rake --tasks?

    除了desc(你已经拥有的)之外,Rake 中没有资金。您可以在项目的自述文件或其他介绍性文档中放置类似的任务描述。


    现在不是关于问题:


    task :rnotes
    

    最好避免使用缩写词 favor release_notes,除非它当然带有某些特殊含义。


      if args.date
        date = args.date
      else
        puts 'Enter the date for the release notes in YYYYMMDD format: '
        date = STDIN.gets.chomp
      end
    

    在 Rubyif中,它返回一个值(在每个作用域中,最后一个表达式的值成为返回值),因此像“if X赋值一个else赋值另一个”这样的模式通常被无条件赋值代替,但内部有一个条件表达式:

      date = if args.date
               args.date
             else
               puts 'Enter the date for the release notes in YYYYMMDD format: '
               STDIN.gets.chomp
             end
    

    ...并且由于条件和第一个返回值相同,因此if成功替换为||:

      date = args.date || begin # хватай args.date, а если его нет, то...
        puts 'Enter the date for the release notes in YYYYMMDD format: '
        STDIN.gets.chomp
      end
    

    File.readlines(template).each do |line|
      release_notes.puts line
    end
    

    “看我怎么做”

    File.readlines(template).each(&release_notes.method(:puts))
    

    该技术对于 Ruby 而言相当不典型,但它确实有效。想要功能?这是给你的一些免积分风格:)

    release_notes.method(:puts)它是一种puts固定在“所有者”( release_notes) 上的方法。从技术上讲,它是Method具有方法的类的对象,该方法call的调用将导致在具有相同参数的相应对象上调用相应的方法。

    任何具有方法的对象call都可以通过提供一个符号来指示它不仅仅是一个参数,而是一个块(每次调用中只能是一个),而不是块传递给方法。

    我不推荐这个技巧,它并不常见,因为不经常使用它会使代码更具可读性。相比:

    (0..9).map { |i| 7 + i }
    (0..9).map(&7.method(:+))
    

    在这里,喜欢一切。也许我会找到别的东西。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5