Ruby未定义的方法'each'用于类

时间:2013-05-04 07:18:05

标签: ruby class methods

当我创建一个Stats类和另一个容器类时,我收到一个错误。错误是

test.rb:43:in `<main>' undefined method `each' for #<Boyfriends:0x2803db8 @boyfriends=[, , , ]> (NoMethodError)

这绝对有意义,因为该类确实不包含该方法,但是ruby应该搜索父方和祖父母类的方法吗?该脚本显示所需的输出;它只是将错误与输出一起嵌入

test.rb:43:in `<main>'I love Rikuo because he is 8 years old and has a 13 inch nose
I love dolar because he is 12 years old and has a 18 inch nose
I love ghot because he is 53 years old and has a 0 inch nose
I love GRATS because he is unknown years old and has a 9999 inch nose
: undefined method `each' for #<Boyfriends:0x2803db8 @boyfriends=[, , , ]> (NoMethodError)

这是代码

class Boyfriends
    def initialize
        @boyfriends = Array.new
    end

    def append(aBoyfriend)
        @boyfriends.push(aBoyfriend)
        self
    end

    def deleteFirst
        @boyfriends.shift
    end

    def deleteLast
        @boyfriends.pop
    end

    def [](key)
        return @boyfriends[key] if key.kind_of?(Integer)
        return @boyfriends.find { |aBoyfriend| aBoyfriend.name }
    end
end

class BoyfriendStats
    def initialize(name, age, nose_size)
        @name = name
        @age = age
        @nose_size = nose_size
    end

    def to_s
        puts "I love #{@name} because he is #{@age} years old and has a #{@nose_size} inch nose"
    end

    attr_reader :name, :age, :nose_size
    attr_writer :name, :age, :nose_size
end

list = Boyfriends.new
list.append(BoyfriendStats.new("Rikuo", 8, 13)).append(BoyfriendStats.new("dolar", 12, 18)).append(BoyfriendStats.new("ghot", 53, 0)).append(BoyfriendStats.new("GRATS", "unknown", 9999))

list.each { |boyfriend| boyfriend.to_s }

1 个答案:

答案 0 :(得分:1)

  
    

这绝对有意义,因为该类确实不包含该方法,但正如我一直在阅读的那样,ruby会在父类和祖父母的课程中搜索该方法吗?

  

这是正确的,但你没有声明任何超类,所以超类将是Object。哪个也没有each方法。

如果你想要一个可枚举的方法,你必须自己定义它 - 你可能想要迭代数组。

在这种情况下,您可以定义一个自己的方法,只将传递的块传递给数组each方法:

class Boyfriends
   def each(&block)
     @boyfriends.each(&block)
   end
end

&block这里让你按名称捕获传递的块。如果你是ruby的新手,这对你来说可能并不重要,并解释它是如何工作的,这有点超出了这个问题的范围。 this Question中接受的答案可以很好地解释块和yield的工作原理。

一旦获得了每种方法,您还可以使用Enumerable来获取一些便捷方法:

class Boyfriends
    include Enumerable
end

此外,to_s是一种应该返回字符串的方法,因此您应该删除puts中的BoyfriendStats#to_s