gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:02:14 29 4
gpt4 key购买 nike

我正在用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com