【问题标题】:ruby what is best way to condition: bar if foo vs foo and bar [closed]ruby 什么是最好的调理方法:bar if foo vs foo and bar [关闭]
【发布时间】:2014-08-14 09:38:14
【问题描述】:

在 Ruby 中检查条件和运行方法的最佳方法是什么?哪个可读性最强?

如果 foo 则为 bar

富和酒吧

【问题讨论】:

  • 视情况而定。没有一种最好的方法。它们同样快。前者在 IMO 上的可读性略高。
  • 我更喜欢前者。
  • 前者更具可读性,但实际上取决于 - 主要基于意见投票结束
  • foo && bar 呢?

标签: ruby syntax conditional-statements convention


【解决方案1】:

我会根据情况使用其中一个。

如果我有兴趣根据满足的条件运行方法(即条件没有副作用):

do_something if this_condition_is_true

如果我有兴趣仅在另一个方法成功完成时才运行一个方法(也就是这两种方法都有副作用):

do_something and do_something_other

【讨论】:

  • 后一个用例是一个不错的考虑。尽管如此,我还是建议使用&& 而不是andand 的优先级低于分配。
  • 我遵循约定:使用&& 表示条件(foo? && bar?),但使用and 表示控制流(do_this and do_that)。
  • 要走的路。但我想说这里最重要的部分是“取决于情况”:-)
【解决方案2】:

编辑 正如 Smar 所指出的,以下内容可能不适用于最新的 Ruby 版本。马上检查。问题继续here


spickermann 提供了一个很好的答案,但是它的第二种情况还不够清楚,所以我将它拼写出来。

通常,您应该使用if,因为它是为此目的而设计的。

bar if foo

但通常,您希望在评估条件的过程中定义一个局部变量。在这种情况下,您不能使用后缀if 表示法;以下将引发错误(前提是之前未定义x):

bar(x) if x = h[:foo]

如果你想把它放在一行,你必须使用and

x = h[:foo] and bar(x)

【讨论】:

  • if 并没有给我带来错误;我刚刚把h = {} ; bar(x) if x = h[:foo] 扔给了irb。
  • @Smar 我也证实了这一点。奇怪的事情正在发生。即使是未定义的bar 也不会引发错误。
  • 我猜这是 Ruby 2.1 左右的新特性。无论如何, undefined bar() 在评估之前不会给出错误;试试这个:h = { :foo => "nyaaan" } ; bar(x) if x = h[:foo]。如果你定义了bar,它将被执行,x 将被赋予值。
  • @Smar 我明白了。我不知道那个功能。那么这应该是出于同样的原因。你有没有提到这个变化的参考资料?
  • @Smar 更改似乎发生在 2.1.1 和 2.1.2 之间。我问了一个新问题here
猜你喜欢
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
相关资源
最近更新 更多