Hash.includes? дает странный результат в кристалле

Я пытаюсь написать Crystal-эквивалент этого кода Python:

test_hash = {}
test_hash[1] = 2
print(1 in test_hash)

Это печатает True, потому что 1 - один из ключей dict.

Вот код Crystal, который я пробовал:

# Create new Hash
test_hash = Hash(Int32, Int32).new
# Map 1 to 2
test_hash[1] = 2
# Check if the Hash includes 1
pp! test_hash.includes?(1)

Но includes? здесь возвращает false. Почему? Какой правильный эквивалент моего кода Python?


person Nick ODell    schedule 28.06.2018    source источник


Ответы (1)


Вместо этого используйте has_key?. has_key? спрашивает, есть ли у хэша этот ключ.

Однако includes? проверяет, есть ли в хеш-таблице определенная пара ключ / значение. Если вы укажете только ключ, он всегда будет возвращать false.

Пример:

# Create new Hash
test_hash = Hash(Int32, Int32).new
# Map 1 to 2
test_hash[1] = 2
# Check if the Hash includes 1
pp! test_hash.has_key?(1)
# Check if the Hash includes 1 => 2
pp! test_hash.includes?({1, 2})


# Pointless, do not use
pp! test_hash.includes?(1)
person Nick ODell    schedule 28.06.2018
comment
Как бы вы использовали includes? вместе с парой ключ / значение? Что-то здесь не так ... - person rogerdpack; 07.07.2018
comment
@rogerdpack: Как бы вы использовали includes?, не имеет значения. includes?({K, V}) является следствием того, что Hash является Enumerable<{K, V}>. Перечислимость хэша - это очень крутая вещь, и даже если я никогда не использую Hash#includes?, я могу использовать Hash#each, Hash#group_by или любые другие замечательные инструменты. - person Amadan; 18.07.2018