Инструменты пользователя

Инструменты сайта


Боковая панель

help:tuples

Это старая версия документа.


Назад: Реальное время

Кортежи

QSP позволяет упаковывать несколько значений в одну переменную, а затем извлекать их оттуда. Упакованные данные называются "строка значений", или "кортеж".

Чтобы создать кортеж, нужно присвоить перемнной, имя которой начинается с символа $ группу значений, перечисленных в круглых скобках через запятую. Пример:

! создаём кортеж
$personage = ("Петя", 27, 182, 92, "боксёр")

Когда мы создаём кортеж, это называется упаковкой данных. Обратный процесс называется распаковкой:

! распаковываем данные из кортежа
$name, age, height, weight, $sports = $personage

Кортежи можно помещать и в отдельные ячейки массивов:

$personage[0] = ("Петя", 27, 182, 92, "боксёр")
$personage[1] = ("Вася", 32, 162, 57, "жокей")
$personage[2] = ("Маша", 19, 158, 42, "фигуристка")
$personage[3] = ("Даша", 24, 202, 81, "баскетболистка")

Индексация ячеек массивов через кортежи

Мы можем индексировать ячейки массивов с помощью кортежей, точно так же, как и с помощью строк. При этом, если кортеж прописывается прямо в квадратных скобках, круглые скобки можно и нужно опускать для лучшей читаемости кода. Таким образом можно создавать многомерные массивы:

! многомерный массив:
$map[1,2] = 'space'
$map[1,3] = 'space'
$map[5,7] = 'tree'
$map[0,-1] = 'hero'
*pl $map[x,y]

! можно, но не рекомендуется,
! писать так:
$map[(1,2)] = 'space'
$map[(1,3)] = 'space'
$map[(5,7)] = 'tree'
$map[(0,-1)] = 'hero'
*pl $map[(x,y)]

Почитать про многомерные массивы можно в соответствующем подразделе раздела "Массивы".

Кортеж из одного значения

Кортежи из одного значения создать невозможно, так как с точки зрения синтаксиса, выражение в скобках — это просто математическое выражение. Как кортеж оно распознаётся только при наличии в этих скобках запятых между значениями. Например:

$tuple=(-1)

В данном случае в переменную $tuple будет записана строка "-1" ввиду автоматического преобразования типа.

Если попытаться индексировать массив через такие "кортежи", могут возникнуть трудности, потому что для движка это обычное математическое выражение, значение которого он вычисляет.

$map[(-1)] будет эквивалентно $map[-1], а значения ячеек при указании на отрицательные индексы игнорируются плеером.

Можно транслировать значения через переменные, как бы соблюдая парадигму записи кортежей.

$tuple=(-1)
$map[$tuple]

Однако это будет эквивалентно использованию обычных строковых индексов.

$tuple=(-1)
*pl $tuple
$map[(-1)]='string'
*pl $map[(-1)]
$map[$tuple]='out'
*pl $map[$tuple]

Возвращение нескольких значений из функции

Поскольку кортежи позволяют упаковывать в переменную несколько значений, появилась возможность возвращать из пользовательской функции сразу несколько значений, используя распаковку:

!foo
$result = (12, 45)

!start
x, y = @foo()

Ограничения кортежей

  • В QSP версии 5.8.0 нельзя вкладывать одни кортежи в другие. Если вы попытаетесь это сделать, вы получите более длинный кортеж:
    		$ht = (12, 34)
    		$rm = (13, 19)
    		$tuple = ($ht, $rm)
    		*pl $tuple
    
  • Кортежи нельзя изменять. То есть, например, в кортеже из трёх элементов нельзя заменить второй элемент. Нужно распаковать кортеж в переменные, изменить одну из переменных и снова упаковать в кортеж:
    		$pos_in_space = (12, -3, 9)
    		x, y, z = $pos_in_space
    		y = -13
    		$pos_in_space = (x, y, z)
    
  • Нельзя извлечь из кортежа одно конкретное значение, например, второе. Зато можно извлекать одно или несколько первых значений. В этом случае из набора переменных, в которые распаковывается кортеж, имя последней должно начинаться с символа $, так как в эту переменную будет упаковываться оставшаяся часть кортежа:
    		$personage = ("Петя", 27, 182, 92, "боксёр")
    		$name, $tale = $personage
    		*pl $name
    		$name, age, height, $tale = $personage
    		*pl "Имя: <<$name>>, возраст: <<age>>, рост: <<height>>."
    		weight, $sports = $tale
    		*pl $sports
    
  • На самом деле в кортежах данные хранятся исключительно в текстовом виде, поэтому некоторые кортежи могут оказаться одинаковыми, хотя вы вносили в них данные разных типов:
    		$tuple_1 = (13, 19)
    		$tuple_2 = ("13", "19")
    		if $tuple_1 = $tuple_2:
    			"кортежи одинаковые"
    		else:
    			"кортежи разные"
    		end
    

Дополнительная информация по кортежам

Ликбез по кортежам в видеоролике на ютуб: "Алгоритмы поиска путей на QSP".

Вперёд: Классический плеер

help/tuples.1672750303.txt.gz · Последние изменения: 2023/01/03 12:51 — aleks_versus