Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 调用返回状态和错误消息的函数链_Ruby - Fatal编程技术网

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