我的目标定义是假设要检查一个数组,看看它是否可以将每个成员应用于数组中的每个成员,如果不是,则假设将它们分开,这样每个都可以应用,否则它就是打印出数组...这是我第一次使用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产生自己,然后将每个元素应用于数组的每个元素......
答案 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}