【问题标题】:Ruby/Rails ternary and rangeRuby/Rails 三元和范围
【发布时间】:2018-04-26 10:32:31
【问题描述】:

如果参数在 1 到 100 的范围内,我想过滤它。

控制器:

@range = search_range(params[:range])

助手:

def search_range(range)
  range = range.to_i
  range == 1..100 ? range : 30
end

但它总是返回 30... 尝试了很多方法和正常的“if/else”但想要三元运算符。 谢谢

【问题讨论】:

  • 你有什么问题?
  • params[:range] 返回什么?
  • 问题是 search_range 总是返回 30...
  • @Stefan ...除非你有猴子补丁Integer#==
  • @Stefan 确实 :)

标签: ruby-on-rails ruby range ternary-operator


【解决方案1】:

如果您的 params[:range] 返回一个数字,我认为您可能需要以下内容:

def search_range(range)
  range = range.to_i
  range == (1..100).include?(range) ? range : 30
end

这就是你的意思吗? IE。如果“范围”变量在 1 到 100 之间,则返回它,否则返回 30?

更新:

我已经对页面上的选项进行了快速基准测试,between? 出现得最快:

              user     system      total        real
include?  0.230000   0.000000   0.230000 (  0.239637)
between?  0.130000   0.000000   0.130000 (  0.129158)
===       0.290000   0.000000   0.290000 (  0.293817)

【讨论】:

  • 或者,更确切地说是(1..100) === range ? range : 30
  • @Stefan:那么默认值30 有什么意义呢? :)
  • params[:range] 是千米距离的整数。像 20。但 search_range 总是返回 30
  • 如果是这种情况@neocydfr,这应该可以。我认为参数名称有点令人困惑,正如 Stefan 所提到的(就像你在使用它时的一系列数字 va 距离一样),但我认为这会让你到达你需要的地方:)
  • @SergioTulentsev (1..100) === range ? range : 30 效果很好,谢谢!
【解决方案2】:

只想检查 params[:range] 是否在 1..100 之间。如果不返回 30

这应该可行:

def search_range(range)
  range = range.to_i
  range.between?(1, 100) ? range : 30
end

您的代码的问题是== 比较对象,即:

20 == 1..100
#=> false

检查整数 20 是否(在数值上)等于范围 1..100。当然不是,1..100 甚至不是数字。

【讨论】:

  • 想要一个三元运算解决方案和良好的可读性谢谢!
  • 我已经对这些选项进行了快速基准测试(请参阅我的答案),这也是最快的...
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2011-01-24
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多