Zeroglif,
Есть вещи, о которых нас интересуют лишь общие сведения, и нам достаточно общего мэйнстримового мнения по ним, есть, которые мы хотим знать глубже, и уже просто на веру "лозунги" не принимаем. И оно так интересней ;) Плохо только то, что оперируют этими лозунгами часто те, для кого некая вещь относится к первой группе (на то они и мэйнстримовые лозунги; хотя, в самом мэйнстриме и его понятиях/лозунгах ничего плохого нет, а чаще - наоборот - я полагаю (нет, даже - искренне верю), что формируют их не те, кто совсем уж не разбирается в предмете). К примеру, любой из вышеперечисленных лозунгов может быть оспорен (в плане сравнения со схожими идеологиями, и выделением частных случаев) и одновременно являться верным. Как частность - все та же динамическая классовая модель Python'a, которую я не ленюсь приводить в сравнении прототипной моделью JS (когда звучит громко второй лозунг) - разница минимальная. Но это вовсе не значит, что я говорю - смотрите, в JS есть классы, я лишь предостерегаю от выкрикивания этих самых лозунгов, когда смысл понят лишь на поверхности. А в целом - беседа с тобой, как всегда, не проходит зря ;) |
а к чему собственно спор пришел?
|
ну т.е. может итоги подвести? какие доводы за/против?
|
x-yuri, какой спор? Спора однозначно никакого не было.
Выводы можно сделать такие: если есть желание знать и понимать глубже технологию, которая тебя интересует, нужно, во-первых - изучать общие закономерности (чтобы не просто повторять громкие "лозунги"), и видеть эти закономерности в этой технологии, а во-вторых, - оперируя контекстом данной технологии, нужно мыслить ее терминологией и идеологией. |
не было спора? я понял, это была светская беседа высокообразованных людей ;-)
какие-то выводы слишком абстрактные получились. Ведь на самом деле, Вы говорите, что есть абстрактное определение ассоциативного массива (множество пар ключ-значение), а есть терминология js (ассоциативный массив там отсутствует). Zeroglif же говорит, что есть терминология js, а все остальное не нужно и только запутывает. Т.е. Вас интересует "истина", у Zeroglif же более практический подход к делу. Но есть один нюанс. Зачем нужны абстракции, чтобы отбросить детали и упростить дальнейшие рассуждения. Почему бы не назвать объект ассоциативным массивом, если он используется только в таком ключе, т.е. никакие методы не вызываются? Другое дело что это может запутать собеседника. Поэтому я считаю, что термин ассоциативный массив имеет место быть при обсуждении задач, решаемых с помощью js, причем не теоретическом, а практическом. |
Интересно хеши в JavaScript в памяти организованы в виде хеш-таблиц?
|
Цитата:
a = dict(a=10, b=20) # равносильно b = {'a': 10, 'b': 20} print(a['a'], b['a']) # 10, 10 Однако, классовая модель Питона, схожа с делегирующей прототипной моделью JS (если свойство не найдено в самом объекте, его поиск продолжается в цепи классов). Таким образом, можно создать класс, унаследованный от dict, и получить полную картину (за исключением небольших нюансов) JS относительно рассуждений выше об "ассоциативности". С одной стороны - это будет "словарь" (хеш/ассоциативный массив), с другой стороны - мы можем удалить свойство в объекте - "а оно, снова тут". Получается вышеописанная неоднозначность ассоциации. # класс A, наследуемый от класса "словарь" (dict) class A(dict): pass # можно было объявить методы, для доступа к свойствам # тогда бы можно было использовать обе конструкции a.prop и a['prop'] a = A() # инстанс a.a = 10 # 10 A.a = 20 # классовое свойство, будет следующим в цепи поиска, если родное свойство не будет найдено print a.a # 10 del a.a # удаляем print a.a # 20 - удалили, а оно опять тут Цитата:
Цитата:
a = { 'b': 10 'c': lambda: 20 } a['b'] # 10 a['c']() # 20 Анализировалось понятие "ассоциативность". И, то ли у нас недостаточно знаний в четких фундаментальных определениях (и, действительно, где границы этой "ассоцитивности", если она столь нечеткая?), то ли, - еще что, но тогда "ассоциативностью" обладают все следующие определения при условии четкой выдачи значения по ключу: - массив - объект - разреженный массив - ассоциативный массив - хеш - список - словарь - map - др. Но, как видно из примера выше с Python'ом, - объект, порожденный от класса, наследуемого от класса "dict" (т.е. объект является "словарем"/ассоциативным массивом) также не однозначен в своей ассоциативности. Поэтому, относительно терминологий, я думаю так: лучше (желательно) оперировать лаконичной терминологией конкретной технологии, но - можно использовать любую другую терминологию, лишь бы это однозначно уложилось в идеологию обсуждаемой технологии. |
кстати, в педивикии сказано, что
Цитата:
Цитата:
|
но спорить на тему, что такое ассоциативный массив очень сложно, потому что я не знаю достоверного источника информациипо этому вопросу. Я видел 2 мнения: 1) набор ассоциаций, 2) массив, у которого в качестве индексов могут быть не только числа. Скорее всего было так: сначала массив пропатчили, и у него появилась возможность использовать не только числа в качестве индексов. А потом его пропатчили так, что его и не узнать уже ;-) все что осталось, так это возможность получить значение по ключу.
Но зачем вообще спорить об этом. Если необходимо указать собеседнику, что данная переменная содержит набор значений, доступных по ключу, то следует использовать "ассоциативный массив". Если же переменная обладает поведением - то это объект Цитата:
|
Цитата:
Насчет "если переменная обладает поведением - то это объект" - тоже - лишь личная версия. Повторю - в Python'e (как и в JS) - по ключу может быть функция, но вместе с тем это остается словарем (объектом-словарем). В Ruby, например, ключом может быть другой Hash: a = {:a => 1, :b => 2} b = {a => 3, :c => 4} # {{:a=>1, :b=>2}=>3, :c=>4} Вообще, ключом в хеше может быть все, что угодно, что хешируемо (hashable), т.е. возвращается значение, вычисленное некой хеш-функцией (из глоссария Питона - http://docs.python.org/3.0/glossary.html#term-hashable) В общем, что можно сказать точно - так это то, что это очень размыто и точно сказать очень сложно. Также верно то, что использование терминологии конкретной технологии тоже более предпочтительно. Иначе, зачем одни называют это "словарями", другие "ассоциативными массивами", другие "хешами"? - ну называли бы одинаково. К примеру, Руби развился из Питона, в Питоне - называется "словарь", - почему создатель Руби не использовал эту же терминологию? А в Википедии, тоже часто субъективные статьи, так в Associative arrays некто пишет, что в JS все контейнеры - ассоциативные эррэи, в JavaScript syntax (там же, Википедия) уже кто-то пишет: "JavaScript objects are often mistakenly described as associative arrays or hashes, but they are neither." Класс, ага - и дальше ни слова об этом =) Так и хочется спросить - почему? Откуда он это взял? Откуда взяли те, кто писал статью про Associative arrays? Получается, каждый пишет, что захочет? Но что-то же должно быть эталоном? Вероятно, все же, таковым должна являться спецификация технологии (и в данном случае, это ECMA). Поэтому, на вопрос "Откуда он это взял?" - ответ будет - "из спецификации, там такого нет". Если же копать глубже - однозначных ответов не будет. Цитата:
|
Часовой пояс GMT +3, время: 23:08. |