【问题标题】:Setting Hash Key value based on if-else condition in a cleaner way以更简洁的方式根据 if-else 条件设置 Hash Key 值
【发布时间】:2017-10-27 15:18:03
【问题描述】:

我正在寻找更简洁的方式来写这个

{
  if(condition)
    a: 25
  elseif
    a: 32
  end

  if(condition)
    b: 25
  elseif
    b: 32
  end

}

我在这样的散列中有各种键,它们都基于相同的条件。

查询 1:如果所有键的条件都相同,是否有更好/更清洁的 ruby​​ 方法?

查询 2:如果所有键的条件都不同,是否有更好/更清洁的 ruby​​ 方法?

我尝试编写接受条件、object1、object2 作为参数的方法,如果条件为真则返回 object1,否则返回 object2。它不工作。

def conditional(condition,object1,object2)
if(condition)
  object1
elsif
  object2
end

结束

【问题讨论】:

  • 试试这个 {a: (condition ? 25 : 32 )}
  • 谢谢,但是 Rubocop 对行长感到不安。 :-)
  • 实际值如下:condition ? "HTTP:#{port}/}"、"HTTP:#{port}# {health_check_information[:path]}"
  • 然后试试这个b = (condition ? 25 : 32 ) 然后{a:b}
  • @SahilRally 您能否在问题中提供所有重要信息,例如ab 的值?为了让我们给出答案,这很重要!

标签: ruby-on-rails ruby


【解决方案1】:

如果条件相同,则在 if 中构造整个哈希。

if condition
  { a: 1, b: 2 }
else
  { a: 3, b: 4 }
end

如果条件特定,我会尝试用小的专门方法提取逻辑。

{ a: value_for_a, b: value_for_b }

【讨论】:

  • 但是那不是重复代码,不遵循 DRY 原则,我实际上是在我的代码中使用它。
  • 第二个不会重复代码(这里的代码你的意思是“哈希结构”?)
  • 我的意思是说,如果需求发生变化并且我们有不同的键值,那么我需要在两个地方进行更改。
  • @SahilRally:不确定您的确切意思,但您提出的(无效)sn-p 更容易受到此影响。
  • @SahilRally 肯定需要权衡取舍。我们两者都尝试,但 IMO 在您开始遇到真正的扩展问题之前,您应该支持干净可读的代码,以便同事更容易深入研究代码。
【解决方案2】:

我建议继续完成工作,而不是过多地关注 rubocop 想要什么。我同意超长的行看起来不太好,应该尽可能避免使用它们 - 但有时字符串(用于 URL 的配置等)可能会变得有点长,所以只需停用此块的行长检查,然后再激活它。

# rubocop:disable LineLength
{ a: "blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla" }
# rubocop:enable LineLength

【讨论】:

    【解决方案3】:

    也许ternary operator 会有所帮助?

    这是一个像这样工作的表达式:

    { if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this }
    

    【讨论】:

    • 你是对的,但是问题是行变得太大并且不可读。使用的实际值很长,而不是简单的 25, 32 。例如,“HTTP:#{port}/}”和“HTTP:#{port}# {health_check_information[:path]}”
    • @SahilRally 你总是可以在条件之前定义变量
    【解决方案4】:

    试试三元表达式

    a = 条件? 25 : 32

    【讨论】:

    • 这已经被建议(以更好的形式)至少两次了。您的回答似乎没有添加任何新内容。
    • 当我提出这个问题时,没有答案。
    【解决方案5】:

    使用 tap 和三进制更易读

    hsh = Hash.new
    
    hsh.tap do |hsh_instance|
      hsh_instance[:a] = get_value_a
      hsh_instance[:b] = get_value_b
    end
    
    def get_value_a
       condition_true? ? value_1_a : value_2_a
    end
    
    def get_value_b
       condition_true? ? value_1_b : value_2_b
    end
    

    【讨论】:

    • rubocop 可能会抱怨更多:)
    • 哦,是的,它会的:)
    • 我有点喜欢这个。但问题是我们在 get 方法中有太多 if else 条件。
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 2011-04-12
    • 2020-07-30
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多