【问题标题】:One-line `if` return statement with two actions带有两个操作的单行“if”返回语句
【发布时间】:2015-12-21 20:45:01
【问题描述】:

我正在寻找一种优雅的方式来将以下 if 语句合并到一行中:

if var1.nil?
  log("some message")
  return
end

我喜欢右手if 可以说的语句

return if var1.nil?

在这种情况下,我需要两个操作,但以下操作不起作用:

log("some message") and return if var1.nil?

有没有办法在一行的右侧使用if 执行两个操作(记录消息和返回)?

【问题讨论】:

  • 它不起作用的原因是因为您的log 方法返回nilfalse

标签: ruby coding-style


【解决方案1】:
  1. 当你有returnbreak等方法时,你可以这样做(假设你对返回值不感兴趣):

    return log("some message") if var1.nil?
    
  2. 一个幼稚的通用方法是:

    (log("some message"); return) if var1.nil?
    
  3. 但是如果你不喜欢括号和分号,那么,这样做:如果and不工作,那么这意味着第一个表达式的返回值是假的,这意味着or应该工作。

    log("some message") or return if var1.nil?
    

    一般来说,andor 之间的一个或另一个会起作用,这取决于第一个表达式的评估值。

【讨论】:

  • 这不是一个丑陋的黑客吗?另外,如果log 方法的返回值取决于记录的内容(如Kernel.p)怎么办?
  • ...,而(继续 @ndn 的第二句话)OP 的 if 语句返回 nil
  • 确实,3. 是一个丑陋的黑客。那不是要走的路。 2.最干净。 1.是下一个。
【解决方案2】:

好吧,为了不依赖布尔评估,您总是可以这样做:

(log('some message'); return) if var.nil?

但我个人觉得它比多行版本的可读性差很多

if var1.nil?
  log('some message')
  return
end

修饰符-if 语法的一个问题是,当行太长时,您甚至可能不会注意到它。观察:

(log('Something really bad happened while you were doing that thing with our app and we are terribly sorry about that. We will tell our engineers to fix this. Have a good day'); return) if var.nil?

【讨论】:

  • “一个问题”可以通过将噪音推送到单独的方法 (def log_blah_blah; log('...'); return; end) 然后说 return log_blah_blah if(var.nil?) 来解决。当我有一堆return false_and_set_msg if(condition) 的东西时,我会经常做这种事情。
  • @muistooshort:是的,这个例子有点做作,但你明白了。有时那条线的肉只用一次,提取方法可能不值得。同样将条件放在前面和中心突出显示了这里的特殊情况。我个人主要将修饰符-ifs 用于return unless user 之类的行。
  • 所有的例子都有点做作 :) 有各种各样的 sometimesmaybes 围绕着这类事情。我在访问控制方法中做了很多return true if(...)\nreturn false if(...)... 之类的事情,有点像“惰性评估查找表”结构,结构紧凑且读起来很好。意见等
猜你喜欢
  • 2020-10-30
  • 2012-09-11
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2013-02-20
相关资源
最近更新 更多