我正在使用递归函数。
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'。当条件满足时如何退出递归函数?
答案 0 :(得分:0)
在执行递归的最后一行中,您将提交一个数组(由行course_names = array_course_name - [ course_name ]
形成)而不是字符串。但是,在if array_course_name.blank?
的测试中,您测试就像传递了一个String。
在递归上传递String或更改测试以查看Array是否为空(或者是否满足您的需要的其他类似基本情况),而不是检查String是否为blank?
。
下一位超出了OP的可能范围,但以防万一你的兴趣:如果你想同时支持Arrays和Strings作为第二个参数的类型,你将不得不添加{{1 } / .class
支持。