Ruby on rails 以更清晰的方式基于if-else条件设置哈希键值

Ruby on rails 以更清晰的方式基于if-else条件设置哈希键值,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在寻找更干净的方式来写这个 { if(condition) a: 25 elseif a: 32 end if(condition) b: 25 elseif b: 32 end } 我在这样的散列中有各种键,它们都基于相同的条件 问题1:如果所有键的条件相同,是否有更好/更干净的ruby方法 问题2:如果所有键的条件都不同,是否有更好/更干净的ruby方法 我尝试编写一个方法,该方法接受条件object1和object2作为参数

我正在寻找更干净的方式来写这个

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

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

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

问题1:如果所有键的条件相同,是否有更好/更干净的ruby方法

问题2:如果所有键的条件都不同,是否有更好/更干净的ruby方法

我尝试编写一个方法,该方法接受条件object1和object2作为参数,如果条件为true,则返回object1,否则返回object2。它不起作用

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

也许会有帮助

这是一个类似于:

{ if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this }
也许会有帮助

这是一个类似于:

{ if_this_is_a_true_value ? then_the_result_is_this : else_it_is_this }

使用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

使用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

试试三元表达式


a=条件?25:32

试试三元表达式


a=条件?25:32

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

if condition
  { a: 1, b: 2 }
else
  { a: 3, b: 4 }
end
如果条件是特定的,我会尝试用小的专门方法提取逻辑

{ a: value_for_a, b: value_for_b }

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

if condition
  { a: 1, b: 2 }
else
  { a: 3, b: 4 }
end
如果条件是特定的,我会尝试用小的专门方法提取逻辑

{ a: value_for_a, b: value_for_b }

我建议继续把事情做好,而不是过于关注rubocop想要什么。我同意过长的行看起来并不好看,应该尽可能避免,但有时字符串(用于URL的配置等)可能会变得有点长,所以只需停用此块的行长度检查,然后再次激活它

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

我建议继续把事情做好,而不是过于关注rubocop想要什么。我同意过长的行看起来并不好看,应该尽可能避免,但有时字符串(用于URL的配置等)可能会变得有点长,所以只需停用此块的行长度检查,然后再次激活它

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


试试这个{a:(条件?25:32)}谢谢,但是Rubocop对行长度感到不安。:-)实际值如下:条件?“HTTP:{port}/}”、“HTTP:{port}{health#u check_information[:path]}”然后试试这个
b=(条件?25:32)
然后
{a:b}
@sahillally你能提供所有重要的信息吗,比如问题中
a
b
的值?为了让我们给出答案,这是非常重要的!!试试这个{a:(条件?25:32)}谢谢,但是Rubocop对行长度感到不安。:-)实际值如下:条件?“HTTP:{port}/}”、“HTTP:{port}{health#u check_information[:path]}”然后试试这个
b=(条件?25:32)
然后
{a:b}
@sahillally你能提供所有重要的信息吗,比如问题中
a
b
的值?为了让我们给出答案,这是非常重要的!!rubocop可能会抱怨更多:)哦,是的,它会:)我有点喜欢这个。但问题是我们在get方法中有太多if-else条件。rubocop可能会抱怨更多:)哦,是的,它会:)我有点喜欢这个。但问题是get方法中有太多的if-else条件。您是对的,但问题是行太大,不可读。使用的实际值冗长且不简单25,32。例如,“HTTP:#{port}/}”和“HTTP:#{port}{health\u check\u information[:path]}”@sahilly您总是可以在条件正确之前定义变量,但问题是行太大,不可读。使用的实际值冗长且不简单25,32。例如,“HTTP:#{port}/}”和“HTTP:#{port}{health\u check_information[:path]}”@sahilly您现在至少可以在建议条件之前(以更好的形式)定义变量两次。你的回答似乎没有添加任何新的内容。当我谈到这个问题时,没有答案。这已经被建议(以更好的形式)至少两次了。你的答案似乎没有添加任何新内容。当我提到这个问题时,没有答案。但这不是重复的代码,不是遵循枯燥的原则,我实际上在我的代码中使用了它。第二个不会重复代码(你所说的代码指的是“哈希结构”),我的意思是,如果需求发生了变化,并且我们有一个不同的键值,那么我需要在两个地方对其进行更改。@Sahillally:不确定您的确切意思,但您建议的(无效)代码段更容易受到此影响。@Sahillally这里肯定有一个折衷办法。我们两者都尝试过,但在你开始遇到真正的伸缩问题之前,你应该喜欢干净可读的代码,这样同事们就更容易深入研究代码。但这不是重复的代码,不是遵循枯燥的原则,我实际上在我的代码中使用了这一点。第二个不会重复代码(你所说的代码是指“哈希结构”?)我的意思是,如果需求发生了变化,并且我们有一个不同的键值,那么我需要在两个位置对其进行更改。@Sahillally:不确定您的确切意思,但您建议的(无效)代码段更容易受到此影响。@Sahillally这里肯定有一个折衷办法。我们尝试两种方法,但在您开始遇到真正的扩展问题之前,您应该喜欢干净可读的代码,以便同事更容易深入了解代码。