为什么我不能在我的Ruby对象上调用.capitalize方法?
这是Ruby的测试代码。为什么我不能在我的Ruby对象上调用.capitalize方法?
class Me
puts "i am me"
end
who = Me.new
myself = who.capitalize
我希望字符串“我是我”会返回,但我错了。 Ruby无法识别来自独特类的新创建对象的.capitalize方法。将“谁是我”字符串返回给用户,这很好,但如果我尝试调用.capitalize,则无法识别该方法。为什么?
这是因为在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
此代码完全符合我的意图。我将一个名为'我'的新变量定义为Me.new.to_s,并将其作为'放下自己'然后'放我自己'。这说明了我的许多方面。非常感谢。问候。 – Milktrader 2010-11-09 04:42:44
尝试在Ruby代码中使用irb,因为你有其他人指出的一些误解。试着弄清楚为什么以及上面的代码是如何工作的,我们在这里提供帮助;) – Chubas 2010-11-09 05:33:30
谢谢你遭受autodidact。阅读一本书并说“是的,好吧,我明白了”然后把书放开并开始编写代码是一回事。 – Milktrader 2010-11-09 13:51:21
我以为所有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"
需要放置在Me
的initialize
方法。但即便如此,您也无法在Me
对象上调用String
方法。
此外,您似乎还有一种印象,即您可以在打印完字符串后更改字符串。这当然是不可能的。一旦你在一个字符串上调用puts
,它就会出现在屏幕上,并且你不能拿回来(你可以使用termios
或终端特定的控制序列,但那不是重点)。
好吧,我认为.capitalize的错误是在Object上定义的String上定义的。 – Milktrader 2010-11-09 04:31:35
@Milktrader,试着理解_why_这是一个错误......它实际上并没有使SENSE在所有对象上都存在这样的方法。例如,如何将数字“5”大写? – horseyguy 2010-11-09 04:44:35
非常感谢回复。我多次重新阅读您的答案,这很有帮助。 – Milktrader 2010-11-09 12:00:07
正如我在我的文档中看到的,只有String
和Symbol
有capitalize
方法。所以只有他们和他们的孩子班才有。
哇,严重的和基本的误解会在这里什么... :) – horseyguy 2010-11-09 04:43:40
的确。认真的理解并不经常来自一个微不足道的“引用” - 误解。 – Milktrader 2010-11-09 12:53:45
当你失败时,失败壮观。 – Milktrader 2010-11-09 15:03:29