我不能插入我的哈希,因为显然它是零类?谁能对此有所了解?

时间:2016-10-28 01:50:47

标签: ruby hash iterator iteration string-interpolation

是否有替代迭代或我可以制作的条件允许我插入一个哈希的值?我已经检查了我输入的结果,显然当我只有一个哈希时,我保存哈希的数组就会消失。我也测试了结果,他们是Nil级。

def print_with_index(students)

   students.each_with_index do |student, index|
      index_plus_one = index + 1  
   puts "#{index_plus_one}. #{students[:name]} (#{students[:cohort]} cohort)"

end
end

我如何解决我的问题,以及哈希为什么会这样做?

完整代码:

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

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

def input_students
  puts "Please enter the names and then the cohort of the students"
  puts "To finish, just hit return twice"
    #created an empty array
  students = []
    #getting the first name
  name = gets.chomp
  cohort = gets.chomp.to_sym
   if cohort.empty?
    cohort = :november
   end

  if cohort !~ /january|february|march|april|may|june|july|august|september|october|november|december/
  puts "Please enter a valid month"
  puts "Warning months are case sensitive. Please enter in lowercase characters."
    cohort = gets.chomp.to_sym
  end

  while !name.empty? do
     # add the student hash to the array called students
  students << {name: name, cohort: cohort}
    if students.count > 1
       puts "Now we have #{students.count} students"
    else students.count == 1
       puts "Now we have #{students.count} student"
    end
       #getting another name from the user
    name = gets.chomp
    cohort = gets.chomp.to_sym

    if cohort.empty?
     cohort = :november
    end

    if cohort !~ /january|february|march|april|may|june|july|august|september|october|november|december/
    puts "Please enter a valid month"
    puts "Warning months are case sensitive. Please enter in lowercase characters."
    cohort = gets.chomp.to_sym
  end

 end

 bycohort = students.sort_by { |v| v[:cohort] }
  filter = students.select! { |student| student[:cohort] == :november }
 puts bycohort #This allows me to see all of my hashes before they are filtered
 puts ""

 bycohort
 filter
 end

def print_with_index(students)

students.each_with_index do |students, index|
  index_plus_one = index + 1 
  puts "#{index_plus_one}. #{students[:name]} (#{students[:cohort]} cohort)"

   end
  end

### body ###
students = input_students
print_header
print_with_index(students)
print_footer(students)

2 个答案:

答案 0 :(得分:1)

这对我有用,我想用each_with_index枚举,你必须传入一组哈希,即[{...},{...},{...}],而不是具有多个键值的单个哈希

def print_with_index(students)

  students.each_with_index do |students, index|
      index_plus_one = index + 1  
      puts "#{index_plus_one}. #{students[:name]} (#{students[:cohort]} cohort)"
  end
end

print_with_index([{name:"b", cohort: "c"}]) 
# 1. b (c cohort)

答案 1 :(得分:0)

您应该使用student代替students作为block参数。您可以检查学生对象是否为nil

def print_with_index(students)

  students.each_with_index do |student, index|
    if !student.nil?
      index_plus_one = index + 1  
      puts "#{index_plus_one}. #{student[:name]} (#{student[:cohort]}  cohort)"
    end
  end
end