2014-09-27 31 views
0

我与一些红宝石(1.9.3)的代码打,试图了解“自我”和面向对象的概念更好:如何把这个小代码放在一个类中?

publiC#without 'public', code works only from irb, not when you save script! (why?) 
def mycap 
    self.capitalize 
end 
x = "some text" 
x.mycap 
#=> "Some text" 

如何包装类各地上面的代码,并保持相同/相似的功能?

回答

1

我所知道的最简单方法是:

class String 
    def mycap 
    self.capitalize 
    end 
end 

p "some text".mycap 

或可能:

x = "some text" 
class << x 
    def mycap 
    self.capitalize 
    end 
end 

p x.mycap 
p 'some text'.mycap #=> won't work, because the method mycap is only for x. 

我恨它,许多文章包含的“自我”和如何使用它的准确定义。在您的Ruby应用运行时,'self'只会改变2次:

a)当您定义一个类(自我更改为该特定类或模块) b)当您调用外部方法接收器(个体变化到接收器)

在上面的第一个例子中,当调用mycap上的“一些文本”,自变为“一些文本”(这是字符串的一个实例)。在第二个示例中,self是x,它是对“某些文本”的引用,它是String的一个实例。就我个人而言,直到我看过these videos by Pragmatic Programmer,我才知道自己的情况,David解释得很好。祝你好运。

+0

你不'self.capitalize'需要'self.',为'self'是默认的接收器。 – 2014-09-27 16:37:42

+0

这个人试图去理解自我,所以排除这个例子会让事情变得更加复杂。 – daremkd 2014-09-27 16:39:08

+0

然后解释一下,而不是建议那里需要'self.'(但它是一个很好的答案)。 – 2014-09-27 16:41:00

相关问题