【问题标题】:Rails return to calling function inside if else blockRails 在 if else 阻塞中返回调用函数
【发布时间】:2015-04-05 14:17:40
【问题描述】:

我正在使用递归函数。

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']。第一次 course 对象将是 Science 对象, course_names 将是 ['Botany', 'Zoology'], course.children 将是 植物学对象。同样它继续执行循环。在最后一个循环 array_course_names 将是空白的,当然是动物学对象,在这种情况下,我想将找到的动物学对象返回给调用函数,但它是 NOT 返回到调用函数,而不是使用 array_course_names 作为 ['Botany', 'Zoology'] 的 else 块,并且由于不存在课程而引发错误“nil 类的未定义方法子项”。满足条件时如何退出递归函数?

【问题讨论】:

  • 没有理由不这样做,仔细检查你的变量和条件
  • 我已经检查过了。它没有返回课程变量,而是在最后一个循环之后进入 else 部分,课程名称为 [科学,数学]
  • 添加puts "\n###\n array_course_name: #{array_course_name}; array_course_name.blank? : #{array_course_name.blank?}\n###\n" as the first line in the self.get_course_to_be_deleted`方法,运行代码;输出可能会显示逻辑故障的位置。

标签: ruby-on-rails if-statement recursion


【解决方案1】:

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

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

下一点超出了您的 OP 的可能范围,但以防万一您感兴趣:如果您想同时支持数组和字符串作为第二个参数的类型,则必须添加 .class /.kind_of? 支持。

【讨论】:

  • 你试过测试array_course_name.count > 0吗? .blank? 肯定是错的,.empty? 可以工作。如果不使用跟踪语句进行调试,则很难分辨。从代码中看并不明显,但您也可以在数组上尝试.flatten.uniq,以确保该值不是[[]],这似乎是空的,但当然不会。
  • 您也可以重组(至少作为调试测试)并尝试测试何时count == 1,然后在分配给course 后返回对象。从逻辑上讲,这应该与您现在正在做的事情在功能上是中立的,但仍然对其进行更改可能会揭示为什么它不适合您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
相关资源
最近更新 更多