以更干净的方式基于if-else条件设置Hash Key值

时间:2017-10-27 15:18:03

标签: 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作为参数,如果条件为true则返回object1,否则返回object2。它不起作用。

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

5 个答案:

答案 0 :(得分:3)

如果条件相同,则在if。

中构造整个哈希
if condition
  { a: 1, b: 2 }
else
  { a: 3, b: 4 }
end

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

{ a: value_for_a, b: value_for_b }

答案 1 :(得分:1)

我建议继续完成任务,而不是过分关注rubocop想要的东西。我可以同意额外冗长的行看起来不太好并且应该避免它们 - 但有时可能会发生字符串(对于URL的配置等)可能会有点冗长,所以只需停用此块的行长度检查,然后再激活它。

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

答案 2 :(得分:0)

也许ternary operator会有帮助吗?

这是一个类似于:

的表达式
Caches:
Current memory usage / total memory usage (bytes):
  TextureCache         74625498 / 75497472
  LayerCache            3538944 / 50331648 (numLayers = 3)
    Layer size 1440x810; isTextureLayer()=1; texid=24 fbo=0; refs=1
    Layer size 1440x810; isTextureLayer()=1; texid=42 fbo=0; refs=1
    Layer size 1440x810; isTextureLayer()=1; texid=48 fbo=0; refs=1
    Layer size 1344x192; isTextureLayer()=0; texid=40 fbo=0; refs=1
    Layer size 1472x192; isTextureLayer()=0; texid=41 fbo=0; refs=1
    Layer size 1344x256; isTextureLayer()=0; texid=23 fbo=0; refs=1
  Layers total   17535744 (numLayers = 6)
  RenderBufferCache           0 /  8388608
  GradientCache           32768 /  1048576
  PathCache                1260 / 33554432
  TessellationCache           0 /  1048576
  TextDropShadowCache         0 /  6291456
  PatchCache                128 /   131072
  FontRenderer 0 A8     1048576 /  1048576
  FontRenderer 0 RGBA         0 /        0
  FontRenderer 0 total  1048576 /  1048576
Other:
  FboCache                    0 /        0
Total memory usage:
  93243974 bytes, 88.92 MB

答案 3 :(得分:0)

使用tap和ternary更具可读性

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

答案 4 :(得分:0)

尝试三元表达式

a =条件? 25:32