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