Как Perl обрабатывает хеш-назначение скалярной переменной? [Дубликат]

Другой общий случай, когда можно получить это исключение, включает в себя насмешливые классы во время модульного тестирования. Независимо от используемой насмешливой структуры, вы должны убедиться, что все соответствующие уровни иерархии классов должным образом высмеиваются. В частности, все свойства HttpContext, на которые ссылается тестируемый код, должны быть изделены.

См. « Исключение NullReferenceException при проверке пользовательского AuthorizationAttribute » для несколько подробного примера.

21
задан Tudor Constantin 22 September 2011 в 18:05
поделиться

4 ответа

Хэш - это массив связанных списков. Функция хэширования преобразует ключ в число, которое используется как индекс элемента массива («ведро»), в который будет храниться значение. Связанный список обрабатывает случай, когда более одного хэша ключа имеет один и тот же индекс («столкновение»).

Знаменатель дроби - это общее количество ковшей.

Числитель фракции - количество ведер, имеющих один или несколько элементов.

Для хэшей с одинаковым количеством элементов, чем больше число, тем лучше. Тот, который возвращает 6/8, имеет меньшее количество столкновений, чем тот, который возвращает 4/8.

20
ответ дан ikegami 26 August 2018 в 00:15
поделиться

Количество используемых ковшей начинается примерно так же, как количество клавиш; выделенные ведра, как правило, являются наименьшей мощностью 2> количества ключей. 5 клавиш вернут 5/8. Большее количество уникальных ключей растет медленнее, так что хеш% h, который является только списком (1..128), с 64 парами ключ / значение, каким-то образом получает скалярное значение 50/128.

Однако, как только хэш выделил свои ведра, они останутся выделенными, даже если вы уменьшите хэш. Я просто сделал хэш% h с 9 парами, таким образом 9/16 скаляр; тогда, когда я переназначил% h, чтобы иметь только одну пару, его скалярное значение было 1/16.

Это на самом деле имеет смысл в том смысле, что позволяет проверить размер хэша, как скаляр простого массива.

1
ответ дан Tom Williams 26 August 2018 в 00:15
поделиться

Чтобы слишком сильно сфокусироваться на этом дробном узоре (в качестве индикатора внутренних деталей хэша), может быть запутанным. Существует один аспект «скалярного значения» хеша, который важен для потенциально каждой программы Perl, и если это считается истинным в булевом контексте , см. Пример:

if (%h) {
    print "Entries in hash:\n";
    for my $k (sort keys %h) {
        print "$k: $h{$k}\n";
    }
}

В perldoc perldata, раздел Scalar-values ​​, вы можете прочитать, что

[...] Булевский контекст - это просто особый вид скаляра контекст, в котором когда-либо не выполняется преобразование в строку или число.

и некоторые абзацы позже

Если вы оцениваете хэш в скалярном контексте, он возвращает false, если хэш пуст. Если есть пары ключей / значений, он возвращает true [...]

0
ответ дан Wolf 26 August 2018 в 00:15
поделиться

Из perldoc perldata :

Если вы оцениваете хэш в скалярном контексте, он возвращает false, если хеш пуст. Если есть пары ключ / значение, он возвращает true; более точно, возвращаемое значение представляет собой строку, состоящую из числа используемых ковшей и количества выделенных ковшей, разделенных косой чертой.

В вашем случае у вас есть пять значений (1, 2, ''cucu', undef и '321312321'), которые были отображены на восемь клавиш (a, b, c, d, r, br, cr и dr).

9
ответ дан Xaerxess 26 August 2018 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: