Ruby 调用返回状态和错误消息的函数链
我有一系列要调用的函数(Ruby 调用返回状态和错误消息的函数链,ruby,Ruby,我有一系列要调用的函数(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
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;并且不清楚返回的是什么:状态还是错误消息?)
有没有更明确的方法?
编辑:澄清我想要什么:
- 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'
在这种情况下,我将使用异常
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: ...
在这种情况下,我会使用异常
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: ...
首先想到的是方法 如果您有
测试
课程:
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
及
首先想到的是方法 如果您有
测试
课程:
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
及