Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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_Class_Error Handling_Return_Refactoring - Fatal编程技术网

如何在ruby中从方法中删除多重返回?

如何在ruby中从方法中删除多重返回?,ruby,class,error-handling,return,refactoring,Ruby,Class,Error Handling,Return,Refactoring,我有一个类a来处理错误, 如何重构它以从调用方法中删除多个返回 基本上,当为true时然后从方法返回error和successfalse Class A def call return method1 if true/false return method2 if true/false return method3 if true/false { success: true } end private def method1 {

我有一个类
a
来处理错误, 如何重构它以从调用方法中删除多个返回

基本上,当
为true时
然后从方法返回
error
success
false

Class A

  def call
    return method1  if true/false
    return method2  if true/false
    return method3  if true/false
    { success: true }
  end

  private

  def method1
  {
    success: false 
    errors: 'X Not Found.'
  }
  end

  def method2
  {
    success: false 
    errors: 'Y Not Found.'
  }
  end


  def method3
  {
    success: false 
    errors: 'Z Not Found.'
  }
  end
end


由于
true
始终为
true
,因此第一个条件将始终为
true
,因此第一个
返回将始终执行。因此,在第一次
返回之后的所有内容都是死代码,永远无法到达。您可以将
调用
方法简化为该方法,该方法100%等效于您的代码:

def调用
方法1
结束
或者,或者

alias_方法:调用,:方法1
由于不再从任何位置调用
method2
method3
,因此您可以将它们删除

由于
method1
只从一个地方调用,即
call
,因此您可以直接内联它,因此整个类变成:

A类
def呼叫
{
成功:错
错误:“未找到X。”
}
结束
结束

这100%等同于您的代码,并且在所有情况下都执行完全相同的操作。(通过无限制反射违反模的封装。)

若您也可以添加条件代码,那个就好了,否则很难找到解决方案。无论如何,您可以有一个
success?
message
方法,并在class方法中格式化它

A类
def呼叫
{
成功:成功?
错误:消息
}.紧凑型
结束
私有的
def成功?
如果x | | y | | z
假的
其他的
真的
结束
结束
def消息
如果x
“你没找到。”
艾尔西夫
“你没找到。”
埃尔西夫z
“找不到Z。”
结束
结束
结束

请注意calls方法中的
compact
,如果消息键为空(如果成功),它将删除消息键。

它也可能为false。编辑问题。以使现有答案无效的方式编辑问题被认为是不礼貌的。请考虑恢复编辑。您可以使用A1,或者根据您的条件,一些<代码>如果ELSIF “显示”,您在示例中确定“代码> true /false ”吗?条件是什么?基于模型级条件。它有一组来自模型的返回true或false的方法。您是否正试图删除多个返回,因为有人告诉您,干净的代码应该只有一个返回?如果是这样,你就错了:是的。我会给他看这个。谢谢