gpt4 book ai didi

ruby - 条件链成功应该是隐式的还是显式的

转载 作者:数据小太阳 更新时间:2023-10-29 08:38:59 24 4
gpt4 key购买 nike

哪种做法更好?要在条件链中隐式或显式地显示成功案例的逻辑?

请注意,以下所有内容的逻辑都是详尽无遗的,因此这实际上是一个风格问题。

隐式

def foobar(foo, bar)
if not foo
"No foo"
elsif not bar
"No bar"
else
"foobar"
end
end

替代隐式

def foobar(foo, bar)
return "No foo" if not foo
return "No bar" if not bar

"foobar"
end

显式

def foobar(foo, bar)
if not foo
"No foo"
elsif not bar
"No bar"
elsif foo && bar
"foobar"
end
end

替代显式

def foobar(foo, bar)
if foo
if bar
"foobar"
else
"No bar"
end
else
"No foo"
end
end

最佳答案

虽然这通常归结为个人偏好问题,即所有给定的解决方案都具有相同的功能属性,但我发现在大多数情况下,最容易阅读的将是最好的。简单的含义因人而异,因为任何具有 C++、Java 或 Perl 背景的人都可能对复杂性有更高的容忍度。

一些纯粹主义者会让您相信每个方法都应该有一个入口点和一个导出点,即末尾有一个单一的 return ,但这似乎是没有真正基础的教条。

“短路”方法,您将使用 return ifreturn unless 测试提前终止方法,测试具有建立“不通过”条件的效果并避免在以后不必要地缩进可能更复杂的代码。这被典型化为:

def complicated_method
return if (@safety == :on)
return unless (Time.now >= @launch_time)

# ...
end

这与您的“替代隐式”示例相对应。

您通常应该努力避免双重否定条件,即使是无意中也是如此。如果你对此粗心大意,你很容易得到双重、三重甚至令人费解的四重否定条件。例如:

if (not @do_not_launch != true)
# Triple negation: If not not launch is not true
else
# Quadruple negation: If not not not launch is not true
end

快点,你应该把核导弹发射例程放在哪个里面,哪个会收到警告?

通常,除非您有 else 子句,否则请使用 unless 而不是 if not

从 Ruby 风格的角度来看,not 以长格式使用也是不寻常的。通常,它要么通过使用 unless 来避免,要么显示为 ! 版本,后者绑定(bind)更紧密,不太可能显着改变逻辑的含义。像 andor 一样,松散绑定(bind)的逻辑运算符可能很不稳定并且不能一致地应用,因为在某些情况下它们的使用会导致太多歧义并发生语法错误.

例如,以下是无效的:

x = not y and z

紧密绑定(bind)的替代方案确实如您所料工作:

x = !y && z

所以我能想到的最好的版本是:

def foobar(foo, bar)
return "No foo" unless (foo)
return "No bar" unless (bar)

"foobar"
end

关于ruby - 条件链成功应该是隐式的还是显式的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com