如何缩短这篇冗长的if
陈述?
if command.downcase != 'course analytics' ||
command.downcase != 'view student averages' ||
command.downcase != 'report cards' ||
command.downcase != 'done'
...
end
答案 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}