#ruby
#ruby
Вопрос:
В c # есть объект DataTable, который представляет собой приятную структуру данных. В Ruby я не могу придумать подобный объект, даже хэш с подмассивами / хэшами, подобными этому:
hash = { val: [] }
Я хочу иметь возможность создавать новый объект DataTable и добавлять к нему столбцы и строки. Есть идеи?
Комментарии:
1. Вместо того, чтобы говорить, какую структуру вы хотите, может быть, покажите нам исходную проблему, и кто-нибудь сможет продемонстрировать удобный способ ее решения с использованием Ruby. Это может быть случай XY
2. В Ruby мы просто создаем классы со
attr_accessor
свойствами.
Ответ №1:
Почему бы не создать класс с желаемой структурой в вашем уме и методами для добавления строк и столбцов и т.д.
Пример (только для базовой демонстрации):
class DataTable
attr_accessor :columns, :rows, :table
def initialize()
self.columns = []
self.rows = []
end
def add_column(column_name)
self.columns.push(column_name)
end
def add_row(row = {})
self.rows.push(row)
end
end
# Create a new datatable
datatable1 = DataTable.new
datatable1.add_column('id')
datatable1.add_row([1])
puts datatable1.columns # ['id']
puts datatable1.rows[0] # [1]
Вы можете решить, как структурировать ваши данные, и иметь больше методов, которые помогут вам достичь того, чего вы хотели бы достичь.
Ответ №2:
Наблюдайте за DataTable
объектом в c#
и что происходит
DataTable dt = new DataTable();
dt.Columns.Add("some_column");
dt.Rows.Add("some_row")
В ruby
classes
есть чертежи для, objects
поэтому нужно будет создать пользовательский classes
. В приведенном выше примере вы можете увидеть три classes
: DataTable
Columns
и Rows
Репликация в Ruby
Приведенное ниже, без сомнения, полно ошибок, но даст вам базовое представление о том, как начать создавать пользовательскую структуру данных.
class DataTable
attr_reader :rows, :columns, :row
def initialize(table_name)
@rows = []
@columns = [ DataColumn.new("id") ]
@primary_key = 0
@selected_row = nil
end
def add_row
@rows << DataRow.new(@columns, @primary_key)
@primary_key = 1
end
def add_column(column_name)
@columns << DataColumn.new(column_name)
@rows.map { |row| row.add_column(column_name) }
end
def select_row(id)
@rows.map(amp;:values).map { |row| row["id"].to_s == id.to_s ? @row = row : nil }
@row
end
alias_method :[], :select_row
def update_row(col, val)
return unless @rows.keys.include? col
@row[col] = val
end
end
class DataColumn
attr_accessor :column_name
def initialize(column_name)
@column_name = column_name
end
end
class DataRow
attr_accessor :values
def initialize(columns, primary_key)
@values = columns.map(amp;:column_name).product([nil]).to_h
@values["id"] = primary_key
end
def add_column(column)
@values[column] = nil unless @values[column]
end
end
затем вы делаете следующее:
d = DataTable.new("table_1")
d.add_row
d.add_row
d.add_column("col_1")
d.add_column("col_2")
d[0]["col_1"] = "some_val"