0

下面的代码可以按我的意愿工作,每次按下 l 时打开或关闭灯。但是,当我尝试添加其他我想通过切换完成的事情时,我不能。

look = 0
lighton = 0
while look < 10
  system 'stty cbreak'
  q = $stdin.sysread 1
  case  q ### #{q} 
  when "l" then if lighton==1 then lighton=0  and puts "ight off"
                else lighton=1 and puts "ight on" end
  end
  system 'stty cooked'
  look += 1
end #while

如果我添加另一个and,它不会被看到,但我没有收到错误:

look = 0
lighton = 0
while look <10
  system 'stty cbreak'
  q = $stdin.sysread 1
  case  q ### #{q} 
  when "l" then if lighton==1 then lighton=0  and puts "ight off" and puts "light still off"
                else lighton=1 and puts "ight on" end
  end
  system 'stty cooked'
  look += 1
end #while

我想向ifelse部分添加更多语句,但不能。

4

2 回答 2

3

没有限制,您只是在滥用and运算符。它不是要“做这做那”,而是“做这个,如果是真的,也做这个”。这是一个简单的例子:

1 and puts 'falsy'
nil and puts 'truthy'
# prints: falsy

因为putsreturnsnil是虚假的,所以puts 'hello' and puts 'world'只会打印“hello”。

所以,不要and用来创建单行。您可以;改用,但这无助于可读性。相反,只需使用多行!发生了什么事情要清楚得多:

case  q
when "l"
  if lighton == 1
    lighton = 0
    puts "light off"
    puts "light still off"
  else
    lighton = 1
    puts "light on"
  end
end

您可能希望阅读更多关于Ruby 中的and/or以及它们与&&/||的区别。

于 2012-08-25T15:44:53.607 回答
0

我对红宝石一无所知,但由于then在你的 if 语句之后发生了多件事,你需要以某种方式对它们进行分组吗?即 Java,您会将它们粘贴在 {}

于 2012-08-25T14:09:04.957 回答