如果else阻塞,Rails返回调用函数

时间:2015-04-04 14:10:15

标签: 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
     #### 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

试过.empty?它不工作! array_course_name总是一个数组,假设我在array_course_names中有三个课程说['Science','Botany','Zoology']。课程对象第一次是Science对象,course_names将是['Botany','Zoology'],course.children将是植物学对象。同样它继续执行循环。在最后一个循环中,array_course_names将为空白,当然是动物对象,在这种情况下我想将找到的动物学对象返回给调用函数,但它是 NOT 返回调用函数而不是使用array_course_names作为['Botany','Zoology']进入else块,并且因为没有课程存在而抛出错误'未定义的方法children for nil class'。当条件满足时如何退出递归函数?

1 个答案:

答案 0 :(得分:0)

在执行递归的最后一行中,您将提交一个数组(由行course_names = array_course_name - [ course_name ]形成)而不是字符串。但是,在if array_course_name.blank?的测试中,您测试就像传递了一个String。

在递归上传递String或更改测试以查看Array是否为空(或者是否满足您的需要的其他类似基本情况),而不是检查String是否为blank?

下一位超出了OP的可能范围,但以防万一你的兴趣:如果你想同时支持Arrays和Strings作为第二个参数的类型,你将不得不添加{{1 } / .class支持。