【问题标题】:Most ellegant and efficent way of returning non-empty option返回非空选项的最优雅和有效的方式
【发布时间】:2017-11-16 03:43:21
【问题描述】:

我正在尝试根据测试结果在 Rails 中选择 AB 测试选项。我想找到一种更有效的方法来进行第一次 nil 测试: 如果给定选项 A 为 nil,则返回 B 如果给定选项 B 为 nil,则返回 A

module AbTestHelper
  def ab_test_choice(ab_test_name, option_a, option_b, *args)
      #This part
      return option_b unless option_a
      return option_a unless option_b
      #This part    

      check_test_enabled = "#{ab_test_name}_enabled?"
      test_result = send(check_test_enabled, args) if respond_to? check_test_enabled
      return option_a if result
      option_b 
  end

  private

  def colour_enabled?(user = current_user)
    return unless user.is_a? User
    user.enabled_for?(:colour)
  end
end

【问题讨论】:

  • 您的工作方式到底有哪些不雅和/或低效的地方?你如何定义“最优雅、最高效”?
  • 虽然这可行,但对我来说似乎有点低效,我必须对两个选项进行相同类型的检查。我想要一种更有效的方法来消除 nil 选项。我这里有 2 个,但如果我有更多,那将是一个一个测试的问题。
  • 对我来说似乎很好。如果我是你,我会继续前进。顺便说一句,你似乎从未设置过result(你似乎设置了test_result),所以return option_a if result 永远不会返回option_a,你将永远返回option_b。除非我错过了什么……
  • 工作代码在这里有点离题。这个问题可能更适合Code Review
  • 为了在您的测试中更准确,我将使用return option_b if option_a.nil? and return option_a if option_b.nil?` 明确检查nil。有一些非零值是错误的。

标签: ruby-on-rails ruby


【解决方案1】:

对我来说似乎没问题,但另一种方法是像这样使用 ^ 运算符:

...
return option_a or option_b if !!option_a ^ !!option_b
...

@987654324 @运算符是独家或,因此,只有其中一个选项是 @987654325 @或 @987654326 @。

问题在于它比原始版本更不惯用且更难理解。

【讨论】:

  • option_aoption_b 都是nil(或更一般地说,都是假的)时,这不起作用。顺便说一句,我不明白为什么需要!!
  • 你说得对,这两个选项都是错误的。并且 !! 只需要在第一个参数上,因为 ^ 如果没有它可能会导致错误:stackoverflow.com/a/1058502/2877645
  • 关于!! 的观点很好。另一种选择是option_a.nil? ^ option_b.nil?,与!! 不同,它在option_a = 'cat'option_b = false(即false)时返回正确的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2012-03-08
相关资源
最近更新 更多