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之后,没有错误。这很奇怪。
.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