Ruby on rails Rails返回if-else块内的调用函数

Ruby on rails Rails返回if-else块内的调用函数,ruby-on-rails,if-statement,recursion,Ruby On Rails,If Statement,Recursion,我使用的是递归函数 def abc get_course_to_be_deleted( courses, array_course_name, nil ) end def self.get_course_to_be_deleted( courses, array_course_name, course ) if array_course_name.blank? #### array_course_name = [] course else #### ar

我使用的是递归函数

def abc
   get_course_to_be_deleted( courses, array_course_name, nil )
end

def self.get_course_to_be_deleted( courses, array_course_name, course )
   if array_course_name.blank?
    #### array_course_name = []
   course
  else
     #### array_course_name = ['Science', 'Maths']
     array_course_name.each do |course_name|
     course = courses.detect{ |course| course.name == course_name  }
     course_names = array_course_name - [ course_name ]
     get_course_to_be_deleted( course.children, course_names, course )
  end
 end
结束


试过了,空的?它不工作!array_course_名称始终是一个数组,假设我在array_course_中有三门课程的名称是['科学'、'植物学'、'动物学']。课程对象将首次成为科学对象,课程名称将为[‘植物学’、‘动物学’],课程。儿童将成为植物学对象。同样,它继续执行循环。在上一个循环中,array\u course\u name将为空,course将是Zoology对象,在这种情况下,我希望将找到的Zoology对象返回到调用函数,但它不会返回到调用函数,而是转到else块,array\u course\u name为['Botany',Zoology']并抛出一个错误“未定义nil类的子方法”,因为不存在课程。当条件满足时,如何退出递归函数

在执行递归的最后一行中,您提交的是一个由行course\u names=Array\u course\u name-[course\u name]构成的数组,而不是一个字符串。但是,在对if数组\u course\u name.blank?的测试中,您的测试就像传递了一个字符串一样

要么在递归中传递字符串,要么更改测试以查看数组是否为空,或者其他满足需要的类似基本情况,而不是检查字符串是否为空


下一位超出了OP的可能范围,但只是为了防止您感兴趣:如果您希望同时支持数组和字符串作为第二个参数的类型,则必须添加.class/.kind\u?支持这一点。

没有理由不起作用,请仔细检查变量,如果我已检查过。它不返回课程变量,而是在最后一个周期后进入else部分,课程名称为[science,Mathematics]Add puts\n\n数组课程名称:{array\u course\u name};数组\u course\u name.blank?:{array\u course\u name.blank?}\n\n作为self.get\u course\u to\u be\u deleted`方法中的第一行,并运行代码;输出可能会显示逻辑故障的位置。您是否尝试过测试array\u course\u name.count>0。空白的肯定是错的,。空的?我可以工作。如果不使用跟踪语句进行调试,则很难判断。从代码中看,这并不明显,但您也可以尝试在数组上使用.flatte.uniq,以确保值不是[[]],它看起来是空的,但当然不会是空的。您还可以至少将其重新构造为调试测试,并尝试在count==1时进行测试,然后在分配给course后返回对象。从逻辑上讲,这在功能上应该与你现在正在做的事情无关,但仍然改变它可能会揭示为什么它不适合你。