【问题标题】:Converting an object to a hash in Ruby在 Ruby 中将对象转换为哈希
【发布时间】:2020-09-15 07:18:42
【问题描述】:

在 Ruby(没有 Rails)中,有没有一种简单的方法可以将对象转换为哈希?我已经做了一些搜索,并且类似的 Rails 解决方案让 OP 尝试使用 .attributes。在普通的 Ruby 中是否有类似的东西?有宝石吗?

这些对象中的每一个都代表我在此处创建的 CSV 文件中的一行:

game_teams_data = CSV.read(location[:game_teams], headers: true, header_converters: :symbol)
    @@game_teams = game_teams_data.map do |row|

然后我以可枚举的形式访问此处的对象

@@game_teams.each do |game|
     game
end

不确定这是否会对我如何进行下面的转换产生影响。

我的对象 #<GameTeam:0x00007ffe9c97d158 @game_id="2012030154", @team_id="30", @hoa="home", @result="LOSS">

我想要达到的输出 hash = {game_id => "2012030154", team_id => "30", hoa => "home", result => "LOSS"}

【问题讨论】:

  • CSV 中有哪些对象?我们需要查看一些 CSV 输入,以及正在生成的对象的内容。请参阅“MCVE”。
  • 如果您只是学习 Ruby,请尽量远离类变量,例如 @@game_teams。而是使用 @game_teams 之类的实例变量,但在对象内部执行此操作,就像在实例方法中一样。

标签: ruby hash rubygems


【解决方案1】:

如果您无法更新GameTeam 以添加to_h 方法,那么您可以获取所需的实例变量并自己制作:

class GameTeam
  def initialize(game_id, hoa, result, team_id)
    @game_id = game_id
    @hoa = hoa
    @result = result
    @team_id = team_id
  end
end

obj = GameTeam.new('2012030154', 'home', 'LOSS', '30')
%i[game_id hoa result team_id].map { |ivar| [ivar, obj.instance_variable_get("@#{ivar}")] }.to_h
# {:game_id=>"2012030154", :hoa=>"home", :result=>"LOSS", :team_id=>"30"}

【讨论】:

  • 这当然是一种方法,但制作GameTeam#to_h 方法更传统。
【解决方案2】:

我会在GameTeam 类中添加一个to_h 方法:

class GameTeam
  # existing code

  def to_h
    { game_id: @game_id, team_id: @team_id, hoa: @hoa, result: @result }
  end
end

然后会像这样调用该方法:

@@game_teams.each do |game_team|
  game_team.to_h
end

【讨论】:

  • 如果类有实例变量的“getter”方法(又名属性读取器),使用它们而不是直接使用变量。如果没有,使用实例变量就可以了。
猜你喜欢
  • 2011-06-29
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2011-03-12
  • 2015-01-04
  • 2011-01-17
相关资源
最近更新 更多