2010-11-09 82 views
0

这是Ruby的测试代码。为什么我不能在我的Ruby对象上调用.capitalize方法?

class Me 
    puts "i am me" 
end 

who = Me.new 

myself = who.capitalize 

我希望字符串“我是我”会返回,但我错了。 Ruby无法识别来自独特类的新创建对象的.capitalize方法。将“谁是我”字符串返回给用户,这很好,但如果我尝试调用.capitalize,则无法识别该方法。为什么?

+1

哇,严重的和基本的误解会在这里什么... :) – horseyguy 2010-11-09 04:43:40

+0

的确。认真的理解并不经常来自一个微不足道的“引用” - 误解。 – Milktrader 2010-11-09 12:53:45

+0

当你失败时,失败壮观。 – Milktrader 2010-11-09 15:03:29

回答

4

这是因为在String类中定义了方法capitalize

首先,在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 
+0

此代码完全符合我的意图。我将一个名为'我'的新变量定义为Me.new.to_s,并将其作为'放下自己'然后'放我自己'。这说明了我的许多方面。非常感谢。问候。 – Milktrader 2010-11-09 04:42:44

+0

尝试在Ruby代码中使用irb,因为你有其他人指出的一些误解。试着弄清楚为什么以及上面的代码是如何工作的,我们在这里提供帮助;) – Chubas 2010-11-09 05:33:30

+0

谢谢你遭受autodidact。阅读一本书并说“是的,好吧,我明白了”然后把书放开并开始编写代码是一回事。 – Milktrader 2010-11-09 13:51:21

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.e.你正在创建一个空的类。

如果你的意图是字符串i am me应印每次你做Me.new时间,puts "i am me"需要放置在Meinitialize方法。但即便如此,您也无法在Me对象上调用String方法。

此外,您似乎还有一种印象,即您可以在打印完字符串后更改字符串。这当然是不可能的。一旦你在一个字符串上调用puts,它就会出现在屏幕上,并且你不能拿回来(你可以使用termios或终端特定的控制序列,但那不是重点)。

+0

好吧,我认为.capitalize的错误是在Object上定义的String上定义的。 – Milktrader 2010-11-09 04:31:35

+0

@Milktrader,试着理解_why_这是一个错误......它实际上并没有使SENSE在所有对象上都存在这样的方法。例如,如何将数字“5”大写? – horseyguy 2010-11-09 04:44:35

+0

非常感谢回复。我多次重新阅读您的答案,这很有帮助。 – Milktrader 2010-11-09 12:00:07

1

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

相关问题