未定义的方法,因为self.new?

时间:2018-03-05 11:36:29

标签: ruby

 class Per
    def prkey(somevar)
      @card = somevar
    end

    def self.some_class
      puts self
    end

    def self.new
     @card = 'ss'
    end
   end

Per.some_class
Per.new.prkey('hi')

我收到了错误:

  

未定义的方法`prkey'代表“ss”:String(NoMethodError)

因为自我新闻?在我评论self.new之后,没有错误。这很奇怪。

3 个答案:

答案 0 :(得分:4)

.new是Ruby内置函数,用于初始化类的新实例,通过定义自己的.new劫持行为,因此新实例不会被实例化

如果您想要在每次实例化类的实例时发生某些事情,请将其置于initialize方法中。

将您的self.new方法替换为:

def initialize
    @card = "ss"
end

答案 1 :(得分:2)

您覆盖了new方法。现在,当您致电Per.new时,它将返回ss字符串,而不是类Per的实例。

然后,您在prkey类的实例上调用String方法,该类未定义。

正如您对问题的评论中所建议的那样,您需要使用def initialize代替def self.new

答案 2 :(得分:1)

如果你想继续做self.new实现,你可以调用super来返回你需要的对象:

class Per
    def prkey(somevar)
        @card = somevar
    end

    def self.some_class
        puts self
    end

    def self.new
        @card = 'ss'
        super
    end
end

Per.some_class
Per.new.prkey('hi')

然而,就像人们已经回答的那样,最好实现初始化方法:

class Per
    attr_accessor :card # getter and setter for card    

    def initialize(card)
        @card = card
    end
end

per = Per.new("hi")
puts per.card # hi
per.card = "hello"
puts per.card # hello