Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将这些小代码放入类中?_Ruby_Self - Fatal编程技术网

Ruby 如何将这些小代码放入类中?

Ruby 如何将这些小代码放入类中?,ruby,self,Ruby,Self,我在玩一些Ruby(1.9.3)代码,试图更好地理解“self”和OOP概念: 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" 如何围绕上述代码包装一个类,并保留相同/相似的功能?我知道的最简单的方法是: class Stri

我在玩一些Ruby(1.9.3)代码,试图更好地理解“self”和OOP概念:

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"

如何围绕上述代码包装一个类,并保留相同/相似的功能?

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

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.
x=“一些文本”
类将不起作用,因为方法mycap仅适用于x。
我讨厌很多文章对“自我”的定义和使用方式不准确在Ruby应用程序运行期间,self仅更改2次:

a) 定义类时(对特定类或模块的自我更改) b) 当您向外部接收器调用方法时(自身更改为该接收器)


在上面的第一个示例中,当您在“sometext”上调用mycap时,self将更改为“sometext”(这是String的一个实例)。在第二个示例中,self是x,它是对“sometext”的引用,是String的一个实例。大卫解释说:“就我个人而言,直到我看过《赛尔夫》之后,我才对自己有所了解。”。祝你好运。

你不需要
self.
self.capitalize
,因为
self
是默认的接收者。这个人试图理解self,所以把它从例子中排除会让事情变得更复杂。然后解释一下,而不是建议那里需要
self.
(但这是一个很好的答案)。我在哪里写的那个self是必需的?嗯,不完全是,因为你要么需要像SomeClass.new.mycap(“一些文本”)或者SomeClass.mycap(“一些文本”)这样的操作这并不完全是面向对象的。如果你想对一个对象做点什么,最好像第一个例子那样,让方法尽可能贴近对象。这就是为什么在Ruby中使用“some string”。大写而不是大写class.new.capitalize('some string'))