diff --git a/lab2/data_table.rb b/lab2/data_table.rb new file mode 100644 index 0000000..6c2db94 --- /dev/null +++ b/lab2/data_table.rb @@ -0,0 +1,63 @@ +class DataTable + def initialize(data) + @data = data.map { |row| row.dup.freeze }.freeze + end + + def item(row, col) + return nil unless valid_row?(row) && valid_col?(col) + @data[row][col] + end + + def rows_count + @data.size + end + + def columns_count + return 0 if @data.empty? + @data.first.size + end + + private + + def valid_row?(row) + row.between?(0, rows_count - 1) + end + + def valid_col?(col) + col.between?(0, columns_count - 1) + end +end + +class DataList + def initialize(items) + @items = items.dup.freeze + @selected = [] + end + + def select(number) + index = number.to_i + toggle_selection(index) if valid_index?(index) + end + + def get_selected + @selected.dup + end + + def get_names + raise NotImplementedError, "Implement this method in a subclass" + end + + def get_data + raise NotImplementedError, "Implement this method in a subclass" + end + + private + + def valid_index?(index) + index.between?(0, @items.size - 1) + end + + def toggle_selection(index) + @selected.include?(index) ? @selected.delete(index) : @selected << index + end +end \ No newline at end of file diff --git a/lab2/test_data_table.rb b/lab2/test_data_table.rb new file mode 100644 index 0000000..58c355d --- /dev/null +++ b/lab2/test_data_table.rb @@ -0,0 +1,39 @@ +require_relative 'data_table' + +data = [ + [1, "Alice", 25], + [2, "Bob", 30], + [3, "Charlie", 35] +] + +data_table = DataTable.new(data) + +puts "Количество строк: #{data_table.rows_count}" # Ожидаем 3 +puts "Количество столбцов: #{data_table.columns_count}" # Ожидаем 3 +puts "Элемент в строке 1, столбце 2: #{data_table.item(1, 2)}" # Ожидаем 30 +puts "Элемент в строке 0, столбце 1: #{data_table.item(0, 1)}" # Ожидаем "Alice" +puts "Элемент за пределами таблицы: #{data_table.item(10, 10)}" # Ожидаем nil + +items = [ + { id: 1, name: "Alice", age: 25 }, + { id: 2, name: "Bob", age: 30 }, + { id: 3, name: "Charlie", age: 35 } +] + +data_list = DataList.new(items) + +data_list.select(0) +data_list.select(2) +puts "Выбранные элементы: #{data_list.get_selected.inspect}" + +begin + data_list.get_names +rescue NotImplementedError => e + puts "Ошибка: #{e.message}" # Ожидаем "Implement this method in a subclass" +end + +begin + data_list.get_data +rescue NotImplementedError => e + puts "Ошибка: #{e.message}" # Ожидаем "Implement this method in a subclass" +end \ No newline at end of file