Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 如何在ruby中将2D数组转换为值对象_Arrays_Ruby_Object - Fatal编程技术网

Arrays 如何在ruby中将2D数组转换为值对象

Arrays 如何在ruby中将2D数组转换为值对象,arrays,ruby,object,Arrays,Ruby,Object,我有一个二维阵列: a = [["john doe", "01/03/2017", "01/04/2017", "event"], ["jane doe", "01/05/2017", "01/06/2017", "event"]...] 我想把它转换成ruby中的value对象。我在这个问题的第二个答案中找到了如何使用散列,而不是2D数组。我想将a[0][0]处的值分配给名为的属性“name”,a[0][1]分配给“date1”,a[0][2]分配给“date2”和a[0][3]分配给“ev

我有一个二维阵列:

a = [["john doe", "01/03/2017", "01/04/2017", "event"], ["jane doe", "01/05/2017", "01/06/2017", "event"]...]
我想把它转换成ruby中的value对象。我在这个问题的第二个答案中找到了如何使用散列,而不是2D数组。我想将
a[0][0]
处的值分配给名为
的属性“name”
a[0][1]
分配给
“date1”
a[0][2]
分配给
“date2”
a[0][3]
分配给
“event”

这与我想要完成的类似,尽管它还不完整,而且我不知道如何在一个循环中为不同的属性分配多个索引:

class Schedule_info
   arrt_accessor :name, :date1, :date2, :event

   def initialize arr
       #I would like this loop to contain all 4 attr assignments
       arr.each {|i| instance_variable_set(:name, i[0])} 

不能在数组索引中存储键值对。您需要记住数组的第一个索引将有“name”并赋值
a[0][0]=“foo”
,或者只使用哈希数组作为您想要的键值功能

2.3.0 :006 > a = []
 => [] 
2.3.0 :007 > hash1 = {name: "hash1name", date: "hash1date", event: "hash1event"}
 => {:name=>"hash1name", :date=>"hash1date", :event=>"hash1event"} 
2.3.0 :008 > a << hash1
 => [{:name=>"hash1name", :date=>"hash1date", :event=>"hash1event"}] 
2.3.0 :009 > hash2 = {name: "hash2name", date: "hash2date", event: "hash2event"}
 => {:name=>"hash2name", :date=>"hash2date", :event=>"hash2event"} 
2.3.0 :010 > a << hash2
 => [{:name=>"hash1name", :date=>"hash1date", :event=>"hash1event"}, {:name=>"hash2name", :date=>"hash2date", :event=>"hash2event"}] 
2.3.0:006>a=[]
=> [] 
2.3.0:007>hash1={name:“hash1name”,日期:“hash1date”,事件:“hash1event”}
=>{:name=>“hash1name”、:date=>“hash1date”、:event=>“hash1event”}
2.3.0:008>a[{:name=>“hash1name”、:date=>“hash1date”、:event=>“hash1event”}]
2.3.0:009>hash2={name:“hash2name”,日期:“hash2date”,事件:“hash2event”}
=>{:name=>“hash2name”、:date=>“hash2date”、:event=>“hash2event”}
2.3.0:010>a[{:name=>“hash1name”、:date=>“hash1date”、:event=>“hash1event”}、{:name=>“hash2name”、:date=>“hash2date”、:event=>“hash2event”}]

听起来您想调用与每个数组值对应的属性访问器方法。您可以使用
send
以编程方式调用方法。所以您需要一个方法名数组,该数组对应于给定数组中的值。现在,假设带有属性的类被称为
Data

attrs = [:name, :date1, :date2, :event]
result = a.map do |e|
  d = Data.new
  e.each.with_index do |v, i|
    d.send(attrs[i], v)
  end
  d
end
result
是从给定数组填充的
Data
对象数组

当然,如果控制
数据
对象的定义,最好的方法是为其提供一个接受值数组的initialize方法

试试这个:

class Schedule_info
  arrt_accessor :name, :date1, :date2, :event

  def initialize arr
    @name = []
    @date1 = []
    @date2 = []
    @event = []
    arr.each |i| do
      name << i[0]
      date1 << i[1]
      date2 << i[2]
      event << i[3]
    end
  end

end
class Schedule\u info
arrt_访问器:name,:date1,:date2,:event
def初始化arr
@名称=[]
@日期1=[]
@日期2=[]
@事件=[]
每个人都是

name这应该足够简短和干净,没有不必要的元编程:

data = [["john doe", "01/03/2017", "01/04/2017", "event"],
        ["jane doe", "01/05/2017", "01/06/2017", "event"]]

class ScheduleInfo
  attr_reader :name, :date1, :date2, :type

  def initialize(*params)
    @name, @date1, @date2, @type = params
  end

  def to_s
    format('%s for %s between %s and %s', type, name, date1, date2)
  end
end

p info = ScheduleInfo.new('jane', '31/03/2017', '01/04/2017', 'party')
# #<ScheduleInfo:0x00000000d854a0 @name="jane", @date1="31/03/2017", @date2="01/04/2017", @type="party">
puts info.name
# "jane"

schedule_infos = data.map{ |params| ScheduleInfo.new(*params) }
puts schedule_infos
# event for john doe between 01/03/2017 and 01/04/2017
# event for jane doe between 01/05/2017 and 01/06/2017
data=[[“约翰·多伊”、“2017年3月1日”、“2017年4月1日”、“事件”],
[“无名氏”、“2017年5月1日”、“2017年6月1日”、“事件”]]
类ScheduleInfo
属性读取器:名称,:日期1,:日期2,:类型
def初始化(*参数)
@name、@date1、@date2、@type=params
结束
def至美国
格式(“%s”表示%s在%s和%s之间),类型、名称、日期1、日期2)
结束
结束
p info=ScheduleInfo.new('jane','31/03/2017','01/04/2017','party')
# #
输入info.name
#“简”
schedule|infos=data.map{| params | ScheduleInfo.new(*params)}
将日程信息放入
#2017年3月1日至2017年4月1日期间为john doe举办的活动
#2017年5月1日至2017年6月1日期间为简·多伊举办的活动

您的意思是要将此数组转换为具有名称、日期等方法的对象数组吗?因此,在转换后,您可以执行[0]。名称、[1]。事件等?我最终希望执行类似于此问题的操作:但对于我的2D阵列,是否有人可以提供我被否决的原因。您的问题不清楚您到底想要什么。你能给我们一个你想要的输出值样本吗?或者一个示例数据结构?在询问我们之前,您还没有展示过任何个人尝试。如果你能表现出你所做的一些不起作用的尝试,你就更有可能获得投票。这就完成了我想知道的属性分配out@EXC3ll3NTrhyTHM很高兴听到这个消息!如果这完全回答了您的问题,请将其标记为已接受的答案(通过按下复选框),以便其他用户能够找到它。非常感谢。您可以创建一个循环,将所有哈希(键和值)放入一个数组中,而不是将哈希值转换为字符串。因此它是一个散列数组。@EXC3ll3NTrhyTHM:我没有将
ScheduleInfo
对象转换为字符串,我只是使用该对象的字符串表示形式
schedule\u infos
是一组
ScheduleInfo
对象,您可以调用
name
date1
。。。在他们身上。