gpt4 book ai didi

ruby - 如何从字符串中选择字母直到预定义点?

转载 作者:数据小太阳 更新时间:2023-10-29 08:42:27 25 4
gpt4 key购买 nike

我想在第一个元音之前提取字符串中的所有辅音,最好不使用正则表达式。例如,如果我有卡车这个词,我想提取“tr”,对于“street”,我想提取“str”。

我尝试了以下操作,但收到错误用于执行元音 block 的参数数量错误(给定 0,预期 1)。

有人可以解释错误出在哪里或建议更简单的方法吗?

vowels = ["a", "e", "i", "o", "u"]

def vowels(words)
letters = words.split("")
consonants = []
letters.each do |letter|
consonants << letter until vowels.include?(letter)
end
consonants
end

最佳答案

请注意您的函数和数组具有相同的名称,vowels。这造成了混淆——您可能认为您是在全局 vowels 数组上调用 include?,但实际上,您的代码试图在没有参数的情况下递归调用同名函数,因此错误。由于 Ruby 允许不带括号的函数调用,因此 Ruby 处理这一行:

vowels.include?(letter)

作为

vowels().include?(letter) # <- wrong number of arguments!

将您的函数名称更改为“元音字母”以外的名称会导致此错误,这更有意义:

undefined local variable or method `vowels' for main:Object
(repl):7:in `block in function_formerly_known_as_vowels'
(repl):6:in `each'
(repl):6:in `function_formerly_known_as_vowels'
(repl):12:in `<main>'

这导致了根本原因:破坏封装。 vowels 函数尝试访问全局范围内的状态。这是一种糟糕的做法(并且在这段代码中不起作用,因为 vowels 数组实际上不是全局的——它需要在变量名上加上一个 $ 前缀,或者另一种使其在函数范围内可见的方法——详情请参见 this answer)。相反,将元音数组作为参数传递给函数(并可能在此过程中泛化函数),或者将其硬编码在函数本身内部,因为我们可以假设元音不会改变。

解决了范围问题后,下一个问题是until 是一个循环。一旦 letter 是辅音,它就会被重复插入 consonants 数组,直到程序耗尽内存。您的意思可能是 unless。即使在这里,您也需要 breakreturn 以在找到元音后退出循环。

最后,一些语义建议:vowels 不是一个非常准确的函数名称。它返回第一个元音之前的辅音,所以这样命名吧!参数“words”可能会产生误导,因为当您的函数似乎只对一个词(或字符串,一般而言)进行操作时,它会建议一个数组或一系列词。

这里重写一下:

def front_consonants(word)
vowels = "aeiou"
consonants = []

word.each_char do |letter|
break if vowels.include? letter
consonants << letter
end

consonants.join
end

p front_consonants "stack" # => "st"

关于ruby - 如何从字符串中选择字母直到预定义点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56408725/

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