如何解决Ruby-Datatable的等效对象?
在c#中,有一个DataTable对象,它是一个不错的数据结构。在Ruby中,我无法想到类似的对象,甚至没有像这样的带有子数组/哈希的哈希:
hash = { val: [] }
我希望能够构造一个新的DataTable对象并向其中添加列和行。有什么想法吗?
解决方法
为什么不创建一个具有所需结构的类以及添加行和列等的方法?
示例(仅用于基本演示):
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]
您可以决定如何构造数据结构,并拥有更多方法来帮助您实现目标。
,观察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(&: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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。