连词和多个返回值

时间:2016-03-12 12:51:35

标签: ruby

我有验证方法,它返回true / false的两个元素数组和一个字符串。一个例子是:

def check_length(name)
  if(name.length > 50)
    return false, "Length more than 50"
  else
    return true, ""
  end
end

我正在尝试检查此类的多种方法。我编写了如下代码:

def validate
  value, message =
  check_length(name) &&
  is_valid(id) &&
  is_any_mismatch(name,id) &&
  is_valid(name) &&
  ...
end

我希望value获取true / falsemessage字符串值。如果check_length返回false,则不应评估第二种方法is_valid

但是对于上面的代码,即使check_length返回false,也会评估is_validvalue会被is_valid的返回值覆盖。

如果第一个条件为false并从validate函数返回,我们如何中断执行?即短路评估应使用两个返回值。

1 个答案:

答案 0 :(得分:0)

返回值是一个数组,所以它永远不会是假的(即使它的第一个元素是false)。这意味着你必须使用析取而不是连接来构造逻辑。检测到的错误将返回一个数组(即真值),缺少错误将是nil。最后,您返回一个具有true的默认数组。

def check_length(name)
  if(name.length > 50)
    return false, "Length more than 50"
  else
    return nil
  end
end

def validate
  check_length(name) ||
  is_valid(id) ||
  is_any_mismatch(name,id) ||
  is_valid(name) ||
  ... ||
  [true, ""]
end

这将返回一个双元素数组,其中true / false作为第一个元素,消息作为第二个元素。