调用返回状态和错误消息的函数链

时间:2014-02-07 11:14:05

标签: ruby

我有一系列要调用的函数(func1func2func3)。我想按此顺序打电话给他们,一旦失败就立即停止。

如果一个函数失败,我希望此函数返回错误消息,以便稍后打印。

我如何在ruby中执行此操作?

我试过了:

def func1
  return true, 'no error'
end

def func2
  return true, 'no error'
end

def func3
  return false, 'error in func3. Reason: ...'
end

def main
  # doesn't work, because an array always evaluates to true
  result = func1 && func2 && func3

  # stops at the first error, but doesn't return the error message
  result = func1[0] && func2[0] && func3[0]
  puts result.inspect
end
main

可以这样做:(但我不喜欢当函数成功时返回false的事实;并且不清楚返回的是什么:状态或错误消息?)

def func1
  return false
end

def func2
  return false
end

def func3
  return 'func 3 failed'
end

def main
  result = func1 || func2 || func3

  puts result.inspect
end
main

有更明确的方法吗?

编辑:澄清我想要的内容:

 - if func1 fails,    func2 fails,    func3 fails:    error is: 'error in func1'
 - if func1 fails,    func2 succeeds, func3 fails:    error is: 'error in func1'
 - if func1 succeeds, func2 succeeds, func3 succeeds: there is no error
 - if func1 succeeds, func2 succeeds, func3 fails:    error is: 'error in func3'

...

2 个答案:

答案 0 :(得分:3)

在这种情况下我会使用例外。

def func1
  true
end

def func2
  true
end

def func3
  raise "error in func3. Reason: ..."
end

def main
  result = func1 && func2 && func3
  puts "success: #{result}"
rescue => ex
  puts ex
end


main
# >> error in func3. Reason: ...

答案 1 :(得分:1)

首先想到的是tap方法!

如果您有Test课程:

class Test
  def a1
    puts "all ok in a1"
  end

  def a2(fail=false)
    unless fail
      puts "all ok in a2"
    else
      raise "a2 error"
    end
  end

  def a3
    puts "all ok in a3"
  end
end 

以及test Test的实例,您可以按如下方式调用链式方法:

test.tap(&:a1).tap { |x| x.a2 }.tap(&:a3)
#=>all ok in a1
#=>all ok in a2
#=>all ok in a3

test.tap(&:a1).tap { |x| x.a2(true) }.tap(&:a3)
#=>all ok in a1
#=>RuntimeError: a2 error,