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