This question already has an answer here:

Closed 5 years ago.

How to implement injection in Ruby?
(1个答案)
我有一个名为Hsh的类,它基本上模拟一个散列它有一个成对对象的数组(其中包含名为1和2的字段,一个是int,另一个是该int的字符串名)。
我应该可以接受以下电话:
h = x.inject({}) {|a, b| a[b.one] = b.two; a}

其中x是Hsh对象。
我不知道如何在hsh中实现注入方法?比如,我要写什么:
def inject ????
??
??
end

它要做的就是创建一个散列映射。

最佳答案

require 'ostruct'

class Hsh
  include Enumerable

  def initialize
    @arr = (0..9).map{ |i| OpenStruct.new(:one => i, :two => "#{i}")}
  end

  def each(&block)
    @arr.each(&block)
  end
end

p Hsh.new.inject({}) {|a, b| a[b.one] = b.two; a}
#=> {5=>"5", 0=>"0", 6=>"6", 1=>"1", 7=>"7", 2=>"2", 8=>"8", 3=>"3", 9=>"9", 4=>"4"}

在这种特殊情况下,实际上Hsh是一个数组,因此除非您将它用于其他没有意义的复杂代码,否则可以更轻松地完成:
p (0..9).map{ |i| OpenStruct.new(:one => i, :two => "#{i}")} \
  .inject({}) {|a, b| a[b.one] = b.two; a}
#=> {5=>"5", 0=>"0", 6=>"6", 1=>"1", 7=>"7", 2=>"2", 8=>"8", 3=>"3", 9=>"9", 4=>"4"}

10-08 13:10