Попытка преобразовать каждый в цикл while создает TypeError.Почему проблема с символами? - PullRequest
0 голосов
/ 29 января 2019

У меня есть готовая программа, но теперь мне нужно преобразовать цикл #Each в цикл #While.Цикл должен выводить почти ту же информацию, но вместо этого он выдает «directory.rb: 24: в« print »: неявное преобразование Symbol в Integer (TypeError)».

def input_students
  puts "Please enter the names of the students"
  puts "To finish, just hit return twice"
  students = []
  name = gets.chomp
  while !name.empty? do
    students << {name: name, cohort: :november}
    puts "Now we have #{students.count} students"
    name = gets.chomp
  end
  students
end

students = input_students

def print_header
  puts "The students of Villains Academy"
  puts "----------"
end

def print(students)
  students.each.with_index(1) do |students, index|
    puts "#{index} #{students[:name]}, #{students[:cohort]} cohort"
  end
end

def print_footer(names)
  puts "Overall we have #{names.count} great students"
end


print_header
print(students)
print_footer(students)

Работает какожидается.Я пытаюсь:

def print(students)
  i = 0
  while i < students.length
    puts "#{students[:name]}, #{students[:cohort]} cohort"
  end
end

Почему цикл #While не работает с аналогичным вводом и почему он пытается преобразовать в целое число?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Поскольку ваш цикл #each скрывал переменную students:

# v                              v
students.each.with_index(1) do |students, index|
  puts "#{index} #{students[:name]}, #{students[:cohort]} cohort"
end

, вы выполняете итерацию массива с именем students, а затем присваиваете каждому элементу массива переменную с именем students.Когда вы избавились от цикла each, вы не изменили блок, чтобы перестать смотреть на students, поэтому теперь он смотрит на массив.Чтобы получить один элемент, попробуйте:

def print(students)
  i = 0
  while i < students.length
    puts "#{students[i][:name]}, #{students[i][:cohort]} cohort"
  end
end
0 голосов
/ 29 января 2019
  while i < students.length
    puts "#{students[:name]}, #{students[:cohort]} cohort"
  end

students - это массив.Вы не можете обращаться к его элементам с помощью символов.Вам нужно использовать i для получения элемента студентов.Вы можете позвонить [:name] по этому вопросу.

Ошибка, я думаю, связана с плохим наименованием в этом фрагменте.И / или не понимая, как работает each.

students.each.with_index(1) do |students, index|  
#                                ^^^^^^
#  This here is called `students`, but its value is a single student, 
#  not a collection of students.
...