2

我知道如果我想按降序对数组进行排序,我必须执行以下操作:

array.sort!{|a,b| b <=> a}

但是,如果我想避免使用“宇宙飞船”(<=>) 运算符,我会直觉地认为我可以执行以下操作,但是当我在 repl.it 上运行它时收到错误消息:

array.sort!{|a, b| 
    if b < a 
        return -1
    elsif b > a
        return 1
    else
        return 0 
    end
}

错误是这样的:

(eval):4: (eval):4: unexpected return (LocalJumpError)
from (eval):0:in `sort!'
from (eval):0

有人请帮助我!

PS我对Ruby很陌生。我只是在学习 Codecademy 的课程。

4

2 回答 2

2

return从方法返回。它只能在方法内部使用。你的代码中没有方法,因此你会得到一个错误......即使有一个方法,代码也不会做你想要的,因为return从方法返回,而不是块。

要从块中返回值,请使用next

array.sort! {|a, b| 
  if b < a 
    next -1
  elsif b > a
    next 1
  else
    next 0 
  end
}

但是,与 C 不同,if//在 Rubythenelse是表达式,而不是语句。(实际上,在 Ruby 中,一切都是表达式,没有语句。)这意味着一切,包括条件表达式,都会返回一个值。For if//返回的值是来自被取的分支的值thenelse

因此,我们可以只返回整个if表达式的值,而不是分别从每个分支返回:

array.sort! {|a, b| 
  next if b < a 
    -1
  elsif b > a
    1
  else
    0 
  end
}

由于块的返回值(就像方法的返回值一样)隐含地是块内评估的最后一个值,我们可以说:

array.sort! {|a, b| 
  if b < a 
    -1
  elsif b > a
    1
  else
    0 
  end
}

next对于以保护子句样式的块的早期中断或展平深度嵌套的条件最有用:

array.sort! {|a, b| 
  next -1 if b < a 
  next  1 if b > a
        0 
}

请注意,case这可能比if这里更合适:

array.sort! {|a, b| 
  case
  when b < a 
    -1
  when b > a
    1
  else
    0 
  end
}
于 2014-08-08T17:44:16.600 回答
1

删除单词return,使您的代码看起来像

array.sort!{|a, b| 
  if b < a 
    -1
  elsif b > a
    1
  else
    0 
  end
}
于 2014-08-08T05:31:34.440 回答