Ruby

时间:2017-07-19 16:43:05

标签: ruby-on-rails ruby

我在代码的一个非常简单的部分(我认为)中得到了错误的值:

org = 4
case org
when org <= 1
  val = 'L'
when 2..3
  val = 'M'
when org >= 4
  val = 'H'
end

puts val
=> nil

拜托,不要生气,我希望我错过了一些非常明显的东西,但我真的无法弄明白。 谢谢。

2 个答案:

答案 0 :(得分:7)

这是一个经典的Ruby错误。 case有两种被调用的方法,一种是基于你传递一个东西到一个分支的方法,另一种是你不需要的方法。

如果您执行case语句中指定表达式,则会评估所有其他条件并与===进行比较。在这种情况下,org <= 1评估为false,而org === false显然不是真的。所有其他情况也是如此,它们无论是真还是假。这意味着它们都不匹配。

如果您没有指定表达式,那么case就像一个花哨的if

case org切换为case即可。您也可以切换到范围:

val =
  case org
  when 0..1
    'L'
  when 2..3
    'M'
  else
    'H'
  end

原始代码的执行方式如下:

org = 4
if (org <= 1) === org
  val = 'L'
elsif (2..3) === org
  val = 'M'
elsif (org >= 4) === org
  val = 'H'
end

这不是你想要的。

答案 1 :(得分:2)

作为替代方案,你可以写:

new_job=queue(a)   # queue(a) is your original function, which returns 2-element lists like ['101', 40]
list_queue.append(new_job)
list_queue.sort(key=lambda a,b: return a[1]<b[1])

它使用了Ruby 2.4附带的Comparable#clamp

对于Ruby 2.3及更早版本,您可以使用:

letters = %w(L L M M H)
val = letters[org.clamp(0,4)]

这样,如果val = letters[[0, org, 4].sort[1]] 小于org或大于0,则可以。