我想问一个关于if和除非的一点解释,我知道这两个是相反的。所有这些时间我都使用了两者,直到现在我发现了一些奇怪的东西。我们来看看我的代码:
ausysdir = AUDIO_SYSTEM_FOLDER_NAME
Dir.mkdir(ausysdir) if ausysdir != "" && !File.directory?(ausysdir) # Number 1
Dir.mkdir(ausysdir) unless ausysdir == "" && File.directory?(ausysdir) # Number 2
现在,在我工作的目录中,文件夹 ausdyr 已经存在。 但是从上面的代码中,第一个条件是如果没有返回错误(这是我的预期,那么好),但不是数字2条件,除非,当我认为如果并且除非相反,那么我上面的语法应该是正确的,我是对的吗?或者我的语法错了?或除非有不同的行为?或者我错过了什么?
非常感谢。
编辑:当我的意思是错误时,是一个例外,因为该文件已经存在。
答案 0 :(得分:1)
unless expr
与if !expr
相同。但!(a && b)
并非!a && !b
,您似乎认为,它实际上是!a || !b
(这是De Morgan的法律BTW之一)。因此,您的if
和unless
语句完全不同。
如果你不相信我,建立真相表。如果你不相信你的真值表,那就研究一些命题演算(每个程序员都应该熟悉)。
如果您的if
有效,则您unless
将是:
unless ausysdir == "" || File.directory?(ausysdir)
答案 1 :(得分:1)
TL; DR不要使用unless
多个条件。大多数人都不得不过于难以理解,然后有大约50/50的机会让它正确。
以下是使用if
/ unless
和&&
/ or
对两个布尔的测试:
def test(first, second)
puts "#{first}, #{second}"
puts " ...passes if #{first} && #{second}" if first && second
puts " ...passes unless #{first} && #{second}" unless first && second
puts " ...passes if #{first} || #{second}" if first || second
puts " ...passes unless #{first} || #{second}" unless first || second
end
test(true, true)
test(true, false)
test(false, true)
test(false, false)
结果:
true && true
...passes if true && true
...passes if true || true
true && false
...passes unless true && false
...passes if true || false
false && true
...passes unless false && true
...passes if false || true
false && false
...passes unless false && false
...passes unless false || false
根据上面的if false && false
结果,您的第一个条件归结为false, false
,if false && false
没有通过。 反应:非常简单易懂。
根据上面的unless false && true
结果,false, true
确实传递,您的第二个条件可归结为unless false && true
。 反应:如果我再考虑一下,似乎可能会有意义。