Ruby - 如何向散列添加条件键?
Ruby - how to add a conditional key to a hash?
我用这个方法创建哈希:
def build_values(data)
{
key1: data.k1,
key2: data.k2,
key3: (@var == true ? data.k3 : nil),
key4: data.k4,
...
}
end
如果 @var == true
,则 key3
的值为 data.k2
。不错。
如果不是true
,那么key3
就没有值(实际上是nil
)。但理想情况下,我根本不想打印 key3
。
我该怎么做?这样的事情不起作用:
def build_values(data)
{
key1: data.k1,
key2: data.k2,
if @var == true
key3: data.k3
end,
key4: data.k4,
...
}
end
如果你关心键的顺序,你可以这样做:
def build_values(data)
data = {
key1: data.k1,
key2: data.k2
}
data[:key3] = data.k3 if @var == true
data.merge(
key4: data.k4,
...
}
end
或者,您可以使用预定义的键顺序(当有更多可选键时可以使用):
KEY_ORDER = %i[key1 key2 key3 key4 ...]
def build_values(data)
data = {
key1: data.k1,
key2: data.k2,
key4: data.k4
}
data[:key3] = data.k3 if @var == true
data.sort_by { |k, _| KEY_ORDER.index(k) }.to_h
end
但是,如果您来到这里,可能值得考虑自定义 class - Struct 甚至 Hash subclass 来处理这些数据。
如果不是@var
:
,也许你可以考虑像rejecting这样的关键
def build_values(data)
{
key1: data.k1,
key2: data.k2,
key3: data.k3,
key4: data.k4
}.reject{ |k, _| k == :key3 && !@var }
end
不是最漂亮的解决方案,但可以使用 **
:
{
key1: data.k1,
key2: data.k2,
**(@var == true ? { key3: data.k3 } : {}),
key4: data.k4,
}
注意如果你只关心@var
是否真实.
可以省略== true
def build_values(data)
hash = {
key1: data.k1,
key2: data.k2,
key4: data.k4,
...
}
hash[:key3] = data.k3 if @var == true
end
我用这个方法创建哈希:
def build_values(data)
{
key1: data.k1,
key2: data.k2,
key3: (@var == true ? data.k3 : nil),
key4: data.k4,
...
}
end
如果 @var == true
,则 key3
的值为 data.k2
。不错。
如果不是true
,那么key3
就没有值(实际上是nil
)。但理想情况下,我根本不想打印 key3
。
我该怎么做?这样的事情不起作用:
def build_values(data)
{
key1: data.k1,
key2: data.k2,
if @var == true
key3: data.k3
end,
key4: data.k4,
...
}
end
如果你关心键的顺序,你可以这样做:
def build_values(data)
data = {
key1: data.k1,
key2: data.k2
}
data[:key3] = data.k3 if @var == true
data.merge(
key4: data.k4,
...
}
end
或者,您可以使用预定义的键顺序(当有更多可选键时可以使用):
KEY_ORDER = %i[key1 key2 key3 key4 ...]
def build_values(data)
data = {
key1: data.k1,
key2: data.k2,
key4: data.k4
}
data[:key3] = data.k3 if @var == true
data.sort_by { |k, _| KEY_ORDER.index(k) }.to_h
end
但是,如果您来到这里,可能值得考虑自定义 class - Struct 甚至 Hash subclass 来处理这些数据。
如果不是@var
:
def build_values(data)
{
key1: data.k1,
key2: data.k2,
key3: data.k3,
key4: data.k4
}.reject{ |k, _| k == :key3 && !@var }
end
不是最漂亮的解决方案,但可以使用 **
:
{
key1: data.k1,
key2: data.k2,
**(@var == true ? { key3: data.k3 } : {}),
key4: data.k4,
}
注意如果你只关心@var
是否真实.
== true
def build_values(data)
hash = {
key1: data.k1,
key2: data.k2,
key4: data.k4,
...
}
hash[:key3] = data.k3 if @var == true
end