为什么我不能在Ruby对象上调用.capitalize方法?

时间:2010-11-09 03:58:23

标签: ruby string

以下是Ruby的测试代码。

class Me  
  puts "i am me"
end

who = Me.new

myself = who.capitalize

我希望字符串“我是我”会回来,但我错了。 Ruby不识别来自唯一类的新创建对象的.capitalize方法。返回谁作为“我是我”的字符串很好,但是如果我尝试调用.capitalize它不会识别该方法。为什么呢?

3 个答案:

答案 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)

正如我在文档中看到的那样,只有StringSymbolcapitalize方法。所以只有他们和他们的子课才有。