创建覆盖面定义

时间:2011-03-27 22:10:28

标签: ruby

我的目标定义是假设要检查一个数组,看看它是否可以将每个成员应用于数组中的每个成员,如果不是,则假设将它们分开,这样每个都可以应用,否则它就是打印出数组...这是我第一次使用ruby,所以我需要一些帮助......我的代码是这样的:

class String
 remove_method(:each)
end

class Object
 def reach
  #checking if responds to each and if so prints it out else
  # returns the objects yielded
  if(x.respond_to?(:each))
    self.each {|x| print x, "\n"}
  else
    yield(self)
  self.each {|x| print x, "\n"}
 end

  end


 #test(remove before submitting)
 [4, 13, 18, "fred", "alice"].each { |x| print x, "\n"}
 [4, 13, 18, "fred", "alice"].reach {|x| print x, "\n"}
 [4, [13, 88], [19, "fred", "snark"], "alice"].each { |x| print x, "\n"}
 [4, [13, 88], [19, "fred", "snark"], "alice"].reach { |x| print x, "\n"}

 gets #waits for user to hit enter to exit the program

我认为我的其他部分是正确的,但我的部分是我正在努力的...我编写代码来检查它是否响应“每个”,如果它确实然后将每个元素应用于每个元素数组.. else产生自己,然后将每个元素应用于数组的每个元素......

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你想在每个支持它的元素上递归调用each(或reach)?尝试类似:

module Enumerable
  def reach &block
    each do |e|
      block.call(e)
      if e.respond_to?(:each)
        e.each(&block) # or, perhaps, e.reach?
      end
    end
  end
end

答案 1 :(得分:0)

基本上,您的算法会触及嵌套数组中的所有元素。为此,您可以使用flatten方法。

arr = [4, [13, 88], [19, "fred", "snark"], "alice"]
arr.flatten.each {|it| puts it}