2016-07-08 3 views
-1

У меня есть следующий код, который ищет буквы« u »и« e »в слове и добавляет 1 к индексу, чтобы он показывал положение в слове, начинающемся с 1, а не 0, а затем объединить его в массив.Ruby "# <NoMethodError: undefined method` + 'для nil: NilClass> "

def vowel_indices(word) 
    x = (word.index("u") + 1) 
    y = (word.index("e") + 1) 
    print = [x,y] 
end 

Я получаю следующее сообщение об ошибке при запуске:

#<NoMethodError: undefined method `+' for nil:NilClass> 

Что такое ноль в этом? Из того, что я вижу, мои переменные назначаются правильно.

+0

Что такое значение 'слово'? –

+0

Слово, которое я тестирую, является «супер». Однако в переменном слове нет значения. – John

+0

Когда я запускаю ваш код с помощью 'vowel_indices (« super »)', он отлично работает. Ошибка в другом месте. Как вы называете метод? –

ответ

0

Это связано с тем, что для некоторых значений, назначенных как word, не может содержать u или e.

Если вы используете Rails, то вы можете преодолеть это путем изменения кода, как это:

def vowel_indices(word) 
    x = (word.try(:index, "u").try(:+, 1) 
    y = (word.try(:index, "e").try(:+, 1) 
    print = [x,y] 
end 

Таким образом, вы можете предотвратить метод пытается вызвать :+ метод, если класс Nil.

В случаях, когда мы не уверены в отношении ввода, лучше использовать try.

+0

@CarySwoveland, спасибо, что указали это. Моя ошибка, я думал, что он использует Rails. Я изменил свой ответ соответственно :) – Lahiru

1

«Что в этом нет?»

Как @ Cary Swoveland и @Lahiru уже сказал, если слово передается в том, что не имеет «U» или «е», что будет сгенерировано исключение:

001 > def vowel_indices(word) 
002?>  x = (word.index("u") + 1) #word.index("u") returns nil if the word arg passed in doesn't have a 'u' 
003?>  y = (word.index("e") + 1) 
004?>  print = [x,y]  #I've never seen the 'print =' syntax...any reason you're not just returning [x,y] here? 
005?> end 
=> :vowel_indices 
006 > vowel_indices("cruel") 
=> [3, 4] 
007 > vowel_indices("cat") 
NoMethodError: undefined method `+' for nil:NilClass 
    from (irb):2:in `vowel_indices' # This tells you exactly where the exception is coming from 
    from (irb):7 
    from /Users/kenenitz/.rvm/rubies/ruby-2.2.0/bin/irb:11:in `<main>' 

Два быстро & грязный способы обработки, это будет либо добавить условное, чтобы проверить наличие каждого письма, или вы можете спасти NoMethodError:

#conditional check (preferred as it is more precise) 
def vowel_indices(word) 
    u_index = word.index("u") 
    e_index = word.index("e") 
    x = u_index ? u_index + 1 : nil #verify that u_index is not nil before calling :+ method 
    y = e_index ? e_index + 1 : nil # same for e_index 

    [x,y] 
end 

#rescuing NoMethodError, not preferred in this case but including as a possible solution just so that you're familiar w/ this approach 

def vowel_indices(word) 
    begin 
    x = word.index("u") + 1 
    y = word.index("e") + 1 
    rescue NoMethodError 
    x = nil 
    y = nil 
    end 
    [x,y] 
end 

при любом решении я обеспечиваю, если слово отсутствует а «и» или ' e ', возвращаемое значение будет содержать nil, который, скорее всего, потребуется какое-то специальная обработка в другом месте в вашей программе:

vowel_indices("cat") 
=> [nil, nil] 

vowel_indices("cut") 
=> [2, nil] 
0
word = "Hello" # example 

def vowel_indices(word) 
    x = (word.index("u") + 1) # x = (nil + 1) *There is no "u" in "Hello" 
    y = (word.index("e") + 1) # y = (1 + 1) *Output as expected based on index 
    print = [x,y] 
end 

p word.index("u") # will return nil if you need to check the return value 
Смежные вопросы