以下是Ruby的测试代码。
class Me
puts "i am me"
end
who = Me.new
myself = who.capitalize
我希望字符串“我是我”会回来,但我错了。 Ruby不识别来自唯一类的新创建对象的.capitalize方法。返回谁作为“我是我”的字符串很好,但是如果我尝试调用.capitalize它不会识别该方法。为什么呢?
答案 0 :(得分:4)
那是因为方法capitalize
是在String
类中定义的。
首先,在行puts "i am me"
中,您只是执行方法puts
。一旦执行,字符串“我就是我”就消失了,因为你没有任何对它的引用,它与我的课程无关。
也许此代码反映了您尝试做的事情
class Me
# Returns the string, can be executed by instances of class Me
def to_s
"i am me"
end
end
puts Me.new.to_s.capitalize
答案 1 :(得分:3)
我认为所有Ruby对象都可以调用.capitalize方法
没有。当且仅当some_obj.some_method
的类或其中一个超类或包含的模块定义方法some_obj
时,才可以调用some_method
。这意味着对于可在任何对象上调用的方法,它需要在Object
类中定义,该类是所有类的超类(或其包含的模块之一)。
capitalize
未定义在Object
String
上,并且有充分理由。 42.capitalize
或[].capitalize
毫无意义。
class Me
puts "i am me"
end
此代码可能不会按您的想法执行。首次读取Me
的类定义时,将打印字符串i am me
。这并未定义Me
类的任何行为。基本上它与:
class Me
end
puts "i am me"
即。你正在创建一个空类。
如果您的意图是每次执行i am me
时都应打印字符串Me.new
,则puts "i am me"
需要放入Me
的{{1}} initialize
方法。但即便如此,您也无法在String
个对象上调用Me
个方法。
此外,您似乎认为可以在打印完字符后更改字符串。这当然是不可能的。一旦你在一个字符串上调用puts
,它就会出现在屏幕上,你无法收回它(你可以使用termios
或终端特定的控制序列,但这不是重点。) / p>
答案 2 :(得分:1)
正如我在文档中看到的那样,只有String
和Symbol
有capitalize
方法。所以只有他们和他们的子课才有。