1

我想使用 Ruby 从文本文件中获取单词列表。我在这里找到了如何使用正则表达式来仅解析单词,因此我制作了如下脚本:

src = File.open("text.txt")
word_list = []
src.each do |line|
  word_list << line.downcase.split(/[^[:alpha:]]/).delete_if {|x| x == ""}
end
word_list.flatten!.uniq!.sort!
p word_list

以下是一个示例文本文件text.txt

TextMate 可能是开发 Ruby on Rails 应用程序的最新热潮,但 Vim 是永恒的。该插件为 Ruby on Rails 应用程序开发提供以下功能。

  1. 自动检测包含来自 Rails 应用程序的文件的缓冲区,并将设置应用于这些缓冲区(并且仅应用于这些缓冲区)。您也可以使用自动命令来应用您自己的自定义设置。

  2. 不打扰。只有 Rails 应用程序中的文件应该受到影响;常规的 Ruby 脚本保持不变。即使启用,如果您不使用它的功能,插件也应该远离您。

  3. Rails 目录结构的轻松导航。gf 考虑上下文并了解部分、固定装置等。有两个命令,:A(备用)和 :R(相关)用于在文件之间轻松跳转,包括模型到迁移、模板到帮助器和控制器到功能测试等收藏夹。对于更高级的用法,提供了:Rmodel、:Rview、:Rcontroller 和其他几个命令。

作为一名 Ruby 新手,我想为这个问题学习更好的(更清晰、简洁和遵循惯例)的解决方案。

感谢您的任何建议和更正。

4

2 回答 2

7

更惯用的代码是:

word_list = open("text.txt")
  .lines
  .flat_map { |line| line.downcase.split(/[^[:alpha:]]/).reject(&:empty?) }
  .uniq
  .sort
于 2012-06-05T10:41:42.297 回答
3
# I suppose you want each line and collect the results
word_list = File.open("text.txt").each_line.collect do |line|
   # collecting is done via collect above, no need anymore
   # .reject(&:empty?) calls .empty? on each element
   line.downcase.split(/[^[:alpha:]]/).reject(&:empty?)
# you can chain on blocks as well
end.flatten!.uniq!.sort!

p word_list
于 2012-06-05T10:32:19.027 回答