【问题标题】:Shorthand for x ? x : yx 的简写? x : 是的
【发布时间】:2019-03-21 01:38:37
【问题描述】:

x ? x : y 有简写吗?一个相对温和的例子:

def find_or_create_by_name(name)
    self.find_by_name(name) ? self.find_by_name(name) : self.create(name)
end

我当然可以做类似的事情

def find_or_create_by_name(name)
    x = self.find_by_name(name)
    x ? x : self.create(name)
end

但是我开始失去我最初用三元运算符节省的空间。 (如果我使用完整的 if 语句,也会出现同样的冗余。

【问题讨论】:

  • x ? x : y 的简写是 x || y,几乎适用于所有非深奥语言。
  • 看起来像 Rails。
  • 看看 Rails 的find_or_create_by(提示:它是find_by(...) || create(...)
  • 请注意,find_by_name(name) ? find_by_name(name) : create(name) 通常与x = find_by_name(name); x ? x : create(name) 不同。例如,假设@tot = 0; def find_by_name(name); @tot += 1; name; end。在第一种情况下,@tot #=> 2,在第二种情况下,@tot #=> 1。请注意,self. 不是必需的,即使该方法使用了它。

标签: ruby ternary-operator


【解决方案1】:

您可以使用|| 运算符:

def find_or_create_by_name(name)
  find_by_name(name) || create(name)
end

【讨论】:

  • @JonathanTuzman:如果它存在(不是 nil 或 false),它将返回 find_by_name(name),否则返回 create(name)
  • @JonathanTuzman 在 Ruby 中,a || b 永远不会返回布尔对象(truefalse),除非对象 a 和/或 b 确实是布尔对象(truefalse,或者换句话说,TrueClassFalseClass 的实例。
猜你喜欢
  • 1970-01-01
  • 2013-12-03
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
相关资源
最近更新 更多