我有一系列要调用的函数(func1
,func2
和func3
)。我想按此顺序打电话给他们,一旦失败就立即停止。
如果一个函数失败,我希望此函数返回错误消息,以便稍后打印。
我如何在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'
...
答案 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,