【问题标题】:Creating each method for custom two dimensional array为自定义二维数组创建每种方法
【发布时间】:2012-10-15 16:36:38
【问题描述】:

我按照这些instructions 为二维数组创建了一个自定义类。

class SparseArray
  attr_reader :hash

  def initialize
    @hash = {}
  end

  def [](key)
    hash[key] ||= {}
  end

  def rows
    hash.length   
  end

  alias_method :length, :rows
end

如何修改这个类,以便可以使用 Object#each 遍历对象的第一级和第二级?请简单解释一下,我是新手。

我将如何在对象上使用 each 方法的示例:

sparse_array[0][0] = "row 1 column 1"
sparse_array[0][1] = "row 1 column 2"
sparse_array[1][0] = "row 2 column 1"

sparse_array.each do |row|
  # sparse_array[0] on first iteration
  row.each do |column|
    # sparse_array[0][0] on first iteration
  end
end

【问题讨论】:

    标签: ruby each sparse-array


    【解决方案1】:

    您应该在您的SparseArray 上定义each 方法并使用它来包装已包装哈希的values

    def each &block
      @hash.values.each(&block)
    end
    

    【讨论】:

    • 像魅力一样工作,谢谢。有没有办法为没有条目的值返回“”或“”(例如,如果 sparse_array[0][1] 没有分配值)?
    • 不确定我是否理解你。首先,each 不会遍历没有条目的值。其次,each 根本不返回值。
    • 是的,谢谢澄清。另一个问题,如何将其更改为sparse_array.each_with_index do |value, index|?谢谢
    【解决方案2】:

    Hash 也有一个 each 方法:

    hash.each {|key, value| puts "#{key} #{value}" }
    

    但是,如果您想要更好的方法,请将其放入您的课程中:

    def each(&block)
      hash.each do |row,column_hash|
        column_hash.each do |column, value|
          block.call(row,column,value)
        end
      end
    end
    

    然后你可以这样做:

    sparse_array.each do |row, column, value|
      puts "row: #{row}, column: #{column}, value: #{value}"
    end
    

    【讨论】:

    • 2cents:先放value,这样你就可以做sparse_array.each{|v| puts v}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多