ruby - 在 Ruby 中使用多个 'gsub' 实例

标签 ruby

我正在用 Ruby (1.9.3) 制作一个基本的翻译器。我从本地测试文件('a.txt')中提取并使用 gsub 替换某些匹配项以模仿从当代英语到中/早期现代英语的翻译。我遇到了可读性问题:

如何使大量的 gsub 用法更易于阅读?我尝试使用以

开头的多行
def translate 
  @text.gsub(/my/, 'mine')
  @text.gsub(/\sis\s/, ' be ')
end

但这只会打印最终的 gsub。我只能假设第二个请求会覆盖第一个。我想避免创建大量的 gsub 请求,但我似乎找不到合适的答案。

这是我当前程序的示例:

lines = File.readlines('a.txt')
@text = lines.join

def translate 
  @text.gsub(/my/, 'mine').gsub(/\sis\s/, ' be ').gsub(/y\s/, 'ye ').gsub(/t\s/, 'te ').gsub(/t\,/, 'te,').gsub(/t\./, 'te.')
end

puts translate

如果这个请求看起来非常基础,我提前道歉。 干杯!

最佳答案

第二个调用不会覆盖第一个。第一次调用返回一个 @text 的副本并进行了替换,但您没有对该返回值执行任何操作。如果要修改@text,需要改用gsub!。如果您不想修改 @text,则需要链接 gsub 调用。例如,如果您有来自 slivu's answer 的映射哈希,这将返回翻译后的文本,而无需实际修改 @text 实例变量:

def translate
  RegexMap.inject(@text) do |string, mapping|
    string.gsub(*mapping)
  end
end

传递给 inject 的 block 在每个映射(RegexMap 中的键/值对)调用一次。第一次,string 是传递给 inject 的值 - 即 @text。之后,每个后续调用都会将前一个调用的返回值作为其 string 值传入。所以就好像你这样做了,但是映射集更容易配置:

@text.gsub(/my/,'mine').gsub(/\sis\s/, ' be ').gsub(/y\s/,'ye ').gsub....

关于ruby - 在 Ruby 中使用多个 'gsub' 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556555/

相关文章:

ruby-on-rails - 准确测量 rspec/ capybara 测试时间?

ruby - Mac 用户并收到警告 : Nokogiri was built against LibXML version 2. 7.8,但已动态加载 2.7.3

ruby-on-rails - 在 Rails 3.2 + SimpleForm 中显示带有嵌套表单错误的字段

ruby-on-rails - application.html.erb 仍未呈现

Ruby selenium/capybara 等待元素消失

ruby-on-rails - 显示带有日期的 collection_select 下拉列表

ruby-on-rails - 如何从模型 B 的 View 内的表单创建模型 A 的实例

ruby - Ruby 大小写相等运算符失败 ===

ruby-on-rails - 事件记录 : Search only on non empty parameters

ruby-on-rails - 让谷歌文件选择器与 drive.file 范围一起工作