Home > OS >  Code doesn't run when I had one more elsif statement
Code doesn't run when I had one more elsif statement

Time:02-11

Can anyone please explain to me why my code doesn't run when I have my second elsif statement in. I'm sure it's something simple but I've been over it a few times, wrote out the code again and still can't work out the bug. It only bugs when line 25 to 30 are in and says

undefined method`[]' on line 35

but this error will change to something else if I run it again.

So this is affecting line_three as a test I am trying "Southern Cross" for the starting location and "Windsor" for the destination.

This is an error message I receive:

Traceback (most recent call last):
pt_planner.rb:35:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

another is:

Traceback (most recent call last):
pt_planner.rb:33:in `<main>': undefined method `-' for nil:NilClass (NoMethodError)

Hope this edit helps

require 'pry'

line_one = ["flinders street", "richmond", "east richmond", "burnley", "hawthorn", "glenferrie"]
line_two = ['Flagstaff', 'Melbourne Central', 'Parliament', 'Richmond', 'Kooyong', 'Tooronga']
line_three = ['Southern Cross', 'Richmond', 'South Yarra' ,'Prahran' 'Windsor']

#1 where would you like to go capture input
puts "what is your starting location?"
user_input_1 = gets.chomp
puts "what is your end location"
user_input_2 = gets.chomp


if line_one.include?(user_input_1) == true and 
    line_one.include?(user_input_2) == true
    origin_index = line_one.index(user_input_1)
    destination_index = line_one.index(user_input_2) 
    route = line_one
elsif  
    line_two.include?(user_input_1) == true and 
    line_two.include?(user_input_2) == true
    origin_index = line_two.index(user_input_1)
    destination_index = line_two.index(user_input_2)
    route = line_two
elsif
    line_three.include?(user_input_1) == true and
    line_three.include?(user_input_2) == true
    origin_index = line_three.index(user_input_1)
    destination_index = line_two.index(user_input_2)
    route = line_three
end

stops = destination_index - origin_index

puts "origin: #{route[origin_index]}\ndestination: #{route[destination_index]}\n#{route.slice(origin_index  1, stops)}\n stops total: #{destination_index - origin_index}"

binding.pry

CodePudding user response:

You tried to search in wrong array

Change

destination_index = line_two.index(user_input_2)

to

destination_index = line_three.index(user_input_2)

Also you don't need to compare with true. include? returns true or false, that's enough. It's better to use && instead of and. And put condition on one line with elsif

You can refactor like this to check both values are in the array

([user_input_1, user_input_2] - line_three).empty?

CodePudding user response:

In your line_three Array, you have forgotten the comma between 'Prahran' and 'Windsor'. As such, Ruby parses this as a string continuation and adds a single element as 'PrahranWindsor' here.

With that, none of your if or elsif conditions match. Consequently, note of the variables you set on any of the branches will be set and instead will be implicitly initialized as nil. As you assume these variables to be set later in your program, things break.

To fix this, you should at first fix the definition of your line_three array.

You should also add code to handle the case that none of your queries matched. Here, you could add a final else branch which e.g. shows an error message and asks the user to try again.

  • Related