undefined方法因为self.new?

问题描述 投票:0回答:3
 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')

我收到了错误:

undefined方法`prkey'代表“ss”:String(NoMethodError)

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

ruby
3个回答
4
投票

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

如果你想在每次实例化一个类的实例时发生某些事情,请将它放在initialize方法中。

self.new方法替换为:

def initialize
    @card = "ss"
end

2
投票

你超越了new方法。所以现在当你调用Per.new时,它将返回ss字符串,而不是类Per的实例。

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

正如在您的问题的评论中建议的那样,您需要使用def initialize而不是def self.new


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')

但是就像人们已经回答过一样,最好实现initialize方法:

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 
© www.soinside.com 2019 - 2024. All rights reserved.