Руби берет последний гласный из слова проблемы - PullRequest
0 голосов
/ 05 ноября 2019

Я много акцентировал внимание на проблеме, которую, как мне кажется, я должен получить, но не знаю, почему она не работает.

В основном метод, который принимает слово и возвращает слово без последнего гласного.

Мой код был:

def lastvowel(word)
    vowels = "aeiou"

    if vowels.include? (word)
        word.reverse.sub(/[aeiou]/, "").reverse
    else
        return word 
    end


end

Проблема была в том, что vowels.include? (слово) не работает? но я чувствую, что это должно работать? Может быть, я думаю о чем-то еще. Поэтому вместо этого я сделал это так:

def lastvowel(word)
    vowel = "aeiou"

    word.each_char do |x|
        if vowel.include?(x) 
        return word.reverse.sub(/[aeiou]/, "").reverse
        end
    end
return word

end

Является ли мое понимание .include? метод не правильный? Любая помощь будет очень признателен, спасибо заранее.

Ответы [ 3 ]

3 голосов
/ 05 ноября 2019

Вы можете определить String#lastvowel:

class String
  def lastvowel
    sub(/(.*)[aeiou](.*)/,'\1\2')
  end
end

и использовать так:

"something".lastvowel
=> "somethng"
2 голосов
/ 05 ноября 2019

vowels.include? (word) будет проверять, например, если слово найдено в строке "aeiou". Прежде всего, вы, скорее всего, хотели проверить обратное, есть ли гласные в слове, а не есть ли слово в гласных;во-вторых, ни одно слово в английском языке не имеет "aeiou" в качестве подстроки (самые близкие AFAIK - "leguleious", "epigaeous", "glutaeous" и "paeounlae", при этом отсутствует один из гласных).

ЧтоВы хотите знать, входит ли любой гласных в слово;самый короткий способ написать это vowels.any? { |vowel| word.include?(vowel) }. Проверка на самом деле не нужна, если в слове нет гласных, вы просто делаете несколько ненужных инверсий.

Наконец, вы можете сделать все за один sub, без инверсий и без тестов. :

word.sub(/[aeiou](?!.*?[aeiou])/, "")

(«гласная, за которой не следует материал и еще одна гласная»)

1 голос
/ 05 ноября 2019
"problematic".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
  #=> "problematc"

"HELLO".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
  #=> "HELL"

"sly".sub(/[aeiou](?=[^aeiou]*\z)/i, '')
  #=> "sly"

См. String # sub .

Регулярное выражение гласит: «соответствует любой гласной ([aeiou]), за которой следует ноль или более (*) символов, кромегласные ([^aeiou]), за которыми следует конец строки (\z), при этом совпадения не зависят от регистра (/i) ".

[aeiou] - это класс символов означает, что должно совпадать только одно из его содержимого.

(?=[^aeiou]*\z) является положительным прогнозом (обозначено ?=).

[^aeiou] являетсятакже класс символов, но карат (^) в первой позиции означает, что должен совпадать ровно один символ, отличный от символов, следующих за ^. Здесь это означает согласный.

Другой способ - использовать метод String # rindex :

str = "problematic"
idx = str.rindex(/[aeiou]/i)
idx ? (str[0,idx]+str[idx+1..-1]) : str
  #=> "problematc"

str = "A"
idx = str.rindex(/[aeiou]/i)
idx ? (str[0,idx]+str[idx+1..-1]) : str
  #=> ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...