Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datatable的Ruby等价对象?_Ruby - Fatal编程技术网

Datatable的Ruby等价对象?

Datatable的Ruby等价对象?,ruby,Ruby,在c#中有一个DataTable对象,它是一个很好的数据结构。在Ruby中,我想不出类似的对象,甚至连具有子数组/哈希的哈希都想不出来: hash = { val: [] } 我希望能够构造一个新的DataTable对象,并向其中添加列和行。有什么想法吗?为什么不在脑海中创建一个具有所需结构的类,以及添加行和列等的方法呢 示例(仅用于基本演示): 您可以决定如何构建数据结构,并有更多的方法来帮助您实现您想要的目标。观察c#中的DataTable对象以及发生了什么 DataTable dt =

在c#中有一个DataTable对象,它是一个很好的数据结构。在Ruby中,我想不出类似的对象,甚至连具有子数组/哈希的哈希都想不出来:

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"