Datatable的Ruby等价对象?
在c#中有一个DataTable对象,它是一个很好的数据结构。在Ruby中,我想不出类似的对象,甚至连具有子数组/哈希的哈希都想不出来:Datatable的Ruby等价对象?,ruby,Ruby,在c#中有一个DataTable对象,它是一个很好的数据结构。在Ruby中,我想不出类似的对象,甚至连具有子数组/哈希的哈希都想不出来: hash = { val: [] } 我希望能够构造一个新的DataTable对象,并向其中添加列和行。有什么想法吗?为什么不在脑海中创建一个具有所需结构的类,以及添加行和列等的方法呢 示例(仅用于基本演示): 您可以决定如何构建数据结构,并有更多的方法来帮助您实现您想要的目标。观察c#中的DataTable对象以及发生了什么 DataTable dt =
hash = { val: [] }
我希望能够构造一个新的DataTable对象,并向其中添加列和行。有什么想法吗?为什么不在脑海中创建一个具有所需结构的类,以及添加行和列等的方法呢 示例(仅用于基本演示):
您可以决定如何构建数据结构,并有更多的方法来帮助您实现您想要的目标。观察
c#
中的DataTable
对象以及发生了什么
DataTable dt = new DataTable();
dt.Columns.Add("some_column");
dt.Rows.Add("some_row")
在ruby
中,类
是对象
的蓝图,因此必须定制类
。在上面的示例中,您可以看到三个类
:数据表
列
和行
在Ruby中复制
下面毫无疑问充满了bug,但可以让您了解如何开始创建自定义数据结构
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(&: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(&:column_name).product([nil]).to_h
@values["id"] = primary_key
end
def add_column(column)
@values[column] = nil unless @values[column]
end
end
与其说你想要什么样的结构,不如告诉我们最初的问题,有人可以演示一种使用Ruby解决它的便捷方法。这可能是XY的一个例子,在Ruby中,我们只是使用
attr\u访问器
属性创建类。
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(&: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(&: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"