2015-04-24 8 views
1

Вот функция для подсчета в if заявления гласные, содержащаяся в строке:Не удается упростить `if` оператор условия

def count_vowels(string) 
sum = 0 
    n = 0 
    while n < string.length 
    if string[n] == "a"||string[n]=="i"||string[n]=="u"||string[n]=="e"||string[n]=="o" 
     sum += 1 
    end 
    n+=1 
    end 
    return sum 
end 

Я нашел повторяющийся string[n] == является излишним и заменить его:

if string[n] == ("a"||"i"||"u"||"e"||"o") 

Однако в этом коде функция не возвращает правильные значения. Почему упрощенная инструкция if здесь не работает?

+0

поиск в буквальном '«AEIOU»' –

+0

возможного дубликата [Test равен ли переменная либо одно из двух значений] (http://stackoverflow.com/questions/2196414/переменный-равно тест-ли-а-либо один-о f-two-values) – toro2k

+0

@Stefan показывает вам, как заменить весь код в вашем методе на одну 21-символьную строку. Разве Рубин не замечательный? –

ответ

4

Это не работает, потому что a == (x || y) is не расширен до a == x || a == y.

Вместо этого a сравнивается с результатом (x || y).

if string[n] == ("a"||"i"||"u"||"e"||"o") 

эквивалентно:

if string[n] == "a" 

, потому что:

("a"||"i"||"u"||"e"||"o") #=> "a" 

Если вы хотите, чтобы упростить код, используйте count:

def count_vowels(string) 
    string.count('aeiou') 
end 
+0

Вы должны, вероятно, упомянуть в ответе, что он не будет обслуживать заглавные буквы. Это может ответить на вопрос, но OP, вероятно, хочет «count_vowels», который, вероятно, должен быть более гласным и гласным. –

0

Это не возвращает правильное количество, потому что || в if string[n] == ("a"||"i"||"u"||"e"||"o") оценивает к первому не ложному состоянию, в этом случае, "a" (не nil или false), так что в основном это то же самое, как if string[n] == "a" .ВЫ могут попробовать с include?:

%w(a i u e o).include? string[n] 

или in?:

string[n].in? %w(a i u e o) 
0

Добавить регулярные expersion

def count_vowels(string) 
sum = 0 
    n = 0 
    while n < string.length 
    if string[n] =~ /[aiueo]/ # will match a, i, u, e or o 
     sum += 1 
    end 
    n+=1 
    end 
    return sum 
end 

Вы можете еще больше упростить код

def count_vowels(string) 
    string.split('').select{|char| char =~ /[aeiou]/}.length 
end 

будет делать то же функциональность

string.split('') 

даст вам массив символов

.select{|char| char =~ /[aeiou]/} 

будет выбрать только " a '' e '' i '' o '' u 'characte RS

.length 

подсчитает число этих символов

+2

Это не отвечает на вопрос. –

1

Существуют различные способы, которые вы можете сделать то, что вы хотите, но причина, это не работает, потому что ("a"||"e"||"i"||"o"||"u") оценивается рубин вернуть первый из этих символов это не false или nil. По существу это положение всегда возвращается "a":

2.2.1 :001 > ("a"||"e"||"i"||"o"||"u") 
=> "a" 

Это означает, что вы всегда испытывать если string[n] == "a" что явно не то, что вы стремитесь достичь.

2

Чтобы ответить на ваш вопрос

string[n] == ("a"||"i"||"u"||"e"||"o") 

Эта часть ("a"||"i"||"u"||"e"||"o") всегда будет вычисляться "a"

так что вы по существу писать

string[n] == "a" 

Лучший способ сделать это может быть

def count_vowels(my_string) 
    mystring.chars.count{ |c| c =~ /[aeiou]+/i } 
end 

Вы также можете расширить класс строк для развлечения

class String 
    def vowels_count 
    chars.count{ |c| c =~ /[aeiou]+/i } 
    end 
end 
+1

Или еще лучше: ''foobar'.count (' aeiou ') # => 3'. – toro2k

+1

Хммм. Это не будет работать для капиталов. –

+1

@ Ryan-NealMes точно так же, как код OP – Stefan

0

Ваш if заявление не работает, потому что == ("a" || ...) не говорит Руби, чтобы проверить, если он равен любому из них. Вместо этого он оценивает ("a" || ...) и проверяет, равен ли он string[n].

«Правильный» упрощенное выражение будет таким:

string[n] =~ /aeiou/i 

Предполагая, что вы хотите прецедентное нечувствительности, то есть. Если нет, то используйте это:

string[n] =~ /aeiou/ 

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

Если вы не хотите, чтобы сделать это , использовать что-то вроде этого, вместо:

['a', 'e', 'i', 'o', 'u'].include? string[n] 
Смежные вопросы