Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中同时翻译多个单词?_Ruby_Substitution - Fatal编程技术网

如何在Ruby中同时翻译多个单词?

如何在Ruby中同时翻译多个单词?,ruby,substitution,Ruby,Substitution,我正在尝试为我和我的朋友创建的语言创建一个替代翻译程序。在这种语言中,某些事情必须同时发生,我不知道如何在Ruby中做到这一点 用一些简单的方法,比如交换元音 a --> u i --> o o --> i u --> a 我刚刚做了这个: input.tr("aiou", "uoia") 但我想不出一种方法来同时进行以下翻译: no --> e e --> y y --> el 所以短语“黄犀牛”将变成“elyllow rhie” 我能做什么有什

我正在尝试为我和我的朋友创建的语言创建一个替代翻译程序。在这种语言中,某些事情必须同时发生,我不知道如何在Ruby中做到这一点

用一些简单的方法,比如交换元音

a --> u
i --> o
o --> i
u --> a
我刚刚做了这个:

input.tr("aiou", "uoia")
但我想不出一种方法来同时进行以下翻译:

no --> e
e --> y
y --> el
所以短语“黄犀牛”将变成“elyllow rhie”


我能做什么有什么建议或例子吗<代码>gsub<代码>tr?另一种方法?

首先定义替换映射:

MAP = {
  'a' => 'u',
  'i' => 'o',
  'o' => 'i',
  'u' => 'a',
  'y' => 'el',
  'no' => 'e',
  'e' => 'y'
}
然后,您可以将其转换为正则表达式,以便在一次快照中匹配所有“键”:

SUBST = Regexp.union(MAP.keys)
这很方便,因为可以使用这些映射表进行替换:

def translate(words)
  words.gsub(SUBST, MAP)
end
这意味着您可以这样做:

puts translate("translate multiple words simultaneously")
# => trunsluty maltoply wirds somaltunyiaslel

tr
是一个很好的工具,但它仅限于单字符替换
gsub
可以做任何事情
tr
可以做更多。

@Stack Overflow表示感谢的方式是接受这个答案(单击左侧的复选标记,使其变为绿色)。@matt新用户通常需要等待一段时间才能接受它。对于@tadman来说,规则是不同的。是的,我不是要为你说话,只是要确保OP知道这一点,因为新用户通常不知道。顺便说一句,回答得真棒;我对此一无所知。有人会问:“这种情况持续多久了?”:)在这种情况下,只需小心如何构建“映射”,这样就不会出现过早的匹配,比如说
{“o”=>“i”,“oh”=>“no”}
@engineersmnky这是一个很好的观点。匹配的第一个字母应该不重叠,或者从最长到最短排列。这可以在pre-Regexp过程中使用
sort\u by
完成。虽然不是最直接的方法,但实际上可以在这里使用。从@tadman的hash
MAP
开始,可以编写
g={“no”=>128.chr,“el”=>129.chr};gi=g.invert;s1,s2=MAP.to|a.transpose.MAP{| a | a.MAP{| s | g.fetch(s,s)}.join};“ienoay”.tr(s1,s2).each|char.map{| s | gi.fetch(s,s)}.join|=>“Oynuel”
。此处
s1#=>“aioue\x80y”;s2#=>“uoiaye\x81”
。看,这是一个很有用的方法。就这么说吧。