使用安全导航操作符处理字符串键的哈希表。

3

我有一个问题:

data = { 'str_key' => ['string1', 'string2'] }

# @param [Hash] data - hash with String key
# @return [boolean]
def some_logic_test?(data)
  data&.<what_to_do_with_string_key?>.include?('string1')
end

如何使用安全导航运算符&.来处理字符串键的哈希表?键的转换是否是强制性的?


4
首先,为什么要使用安全导航运算符?data是否可能为nildata是否可能不是一个哈希对象?'str_key'是否可能不存在?'str_key'是否可能存在但不是一个数组?你试图解决的实际问题是什么? - Stefan
你的问题一点也不清楚。 - sawa
1
在这里使用安全导航似乎有点深奥,因为在该方法中,一个简单的 return unless data 守卫子句将是完全适当的(并且更易读)。 - engineersmnky
1个回答

10
这个关键字是String并不重要,你想要的(我猜)是使用安全操作符和[]方法,你可以这样做:
data&.[]('str_key')&.include?('string1')

您还可以使用Hash#dig方法,我认为这将提高代码的可读性:

data&.dig('str_key')&.include?('string1')

Hash#dig还有一个优点,它可以正确地处理嵌套的哈希表(实际上它就是为了处理这种情况而设计的):

data = { 'str_key' => { 'str_key1' => { 'str_key2' => 'str_value' } } }
data.dig('str_key', 'str_key1', 'str_key2')
# => 'str_value'

所以,也许这样会更好:哪个解决方案会是最好的? - Radosław Sakowicz
1
@RadosławSakowicz 这取决于输入数据,就像 Stefan 在你的问题下面评论中提到的那样。如果 data 可能为 nil,则必须考虑这种可能性。否则,data['str_key']&.include?('string1') 就足够了,显然。 - Marek Lipka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接