由于自我.new而未定义的方法


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

我收到错误:

对于"ss"的未定义方法"prkey":String (NoMethodError(

因为自我.新的?在我注释掉 self.new 之后,没有错误。这很奇怪。

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

如果您希望每次实例化类的实例时都发生某些事情,请将其放入 initialize 方法中。

self.new方法替换为:

def initialize
    @card = "ss"
end

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

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

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

如果你想

继续做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 

最新更新