缩短这个if语句的方法

时间:2013-12-01 23:23:19

标签: ruby if-statement

如何缩短这篇冗长的if陈述?

if command.downcase != 'course analytics' ||
   command.downcase != 'view student averages' ||
   command.downcase != 'report cards' ||
   command.downcase != 'done'
...
end

5 个答案:

答案 0 :(得分:9)

Enumerable的{​​{3}},any?all?是您此类事情的朋友

VALID_COMMANDS = [
  'course analytics',
  'view student averages',
  'report cards',
  'done' ]

if VALID_COMMANDS.any? {|s| command.downcase != s }

在没有看到if的正文的情况下,我怀疑你对你的合并操作符有错误(正如所写的那样,你的条件总是正确的,因为被测试的字符串必须与其中一个值不同如上所述,你正在测试命令是否不等于任何字符串,我怀疑你要么测试它是否等于其中一个或者没有。

if VALID_COMMANDS.none? {|s| command.downcase == s }

当块中的测试相等时,include?(foo)等同于any? {|x| x == foo },因此这是使用include的等效none?测试:

unless VALID_COMMANDS.include? command.downcase

答案 1 :(得分:4)

unless ['course analytics', 'view student averages', 'report cards', 'done'].include? command.downcase

编辑:

在对原始问题的三读时,我认为这在逻辑上是等价的:

if true
  ...
end

即。它总是会评估为真。原始问题需要一些澄清。

答案 2 :(得分:2)

你可以很简单。你的代码:

if # long condition part
  ...
end

相当于:

...

这是没有条件的身体。你可以摆脱整个if条件。

答案 3 :(得分:1)

这都是倒退:

if command.downcase != 'course analytics' ||
  command.downcase != 'view student averages' ||
  command.downcase != 'report cards' ||
  command.downcase != 'done'
  ...
end

这很难阅读,逻辑也不明显。

不是搜索“not”条件,而是查找肯定匹配并使用else子句处理任何不匹配的内容:

case command.downcase
when 'course analytics'
  # do the 'course analytics' thing
when 'view student averages' 
  # do the 'view student averages'  thing
when 'report cards'
  # do the 'report cards' thing
when 'done'
  # do the 'done' thing
else
  # do the default thing
end

如果您正试图淘汰一系列具有相同操作的选项:

case command.downcase
when 'course analytics', 'view student averages', 'report cards', 'done'
  ...
else
  # do the default thing
end

答案 4 :(得分:-1)

['course analytics','view student averages', 'report cards', 'done'].map{ |n| n !=  command.downcase }.reduce(false) {|p,n| p||n}