我有这个红宝石代码:
def print2(string)
puts "#{string} #{string}"
end
class String
def print2
print2 self
end
end
print2 "abc"
"abc".print2
如果我运行它,我在调用" abc" .print2:
时会收到此错误我明白为什么会收到错误,但有没有办法可以调用"顶级" print2方法来自String类中的print2方法?
答案 0 :(得分:2)
在顶层范围中定义方法时,它将被定义为order
上的私有实例方法。所以,这将有效:
Object
由于def print2(string)
puts "#{string} #{string}"
end
class String
def print2
super self
end
end
"abc".print2
是String
的子类,Object
是super
的第一个定义。
然而,这可能是不好的做法。如果您在一个认真的项目中使用它,您应该将print2
放在一个单独的模块中。
答案 1 :(得分:0)
你可以试试这个,你会发现它不起作用。
class String
def print2
#print2 self
end
def print2(string)
print2
end
end
"abc".print2
"abc".print2("def")
如果print2
课程中String
退出,则ruby不会在print2
课程中寻找Object
。
irb(main):015:0> String.instance_methods.grep(/print/)
=> [:print2] #it already exists.